首页 > 解决方案 > 使用反应性元素更改非反应性数据框的问题

问题描述

我正在与 R Shiny 合作,这是我面临的问题:

我有一个非反应性的数据集(命名数据集)。我闪亮的应用程序的用户将输入一个值,该值表示将受到影响的行的百分比。

例如,如果用户输入“20”,那么我的服务器将抽取我数据集行的 20% 的样本,修改该行中的 1 列,并将此更改的行放回数据集中。

我还想最终打印原始数据集的摘要,然后打印更改数据集的摘要。

这就是我所做的(这pop是用户输入值):

#the number of rows I want to change
popint1 <- reactive({round(input$pop * 0.01 * nrow(dataset)})

#then get the summary of the original dataset
orig_summary <- reactive({dataset %>%
          group_by(age_group) %>%
          summarise(original_cvd_count = sum(as.numeric(s723d)),
                    meanSBP = mean(sb16s, na.rm = T),
                    meanDBP = mean(sb16d, na.rm = T)) %>%
          mutate(new_cvd_count = newRisk(meanSBP, meanDBP) * original_cvd_count)
      })


#then change the 'sb16s' column in a random sample of rows and put the changed rows back
env <- reactive({
        req(dataset)

        dataset[sample(nrow(dataset), popint1()), 'sb16s'] <- dataset[sample(nrow(dataset), popint1(), seed), 'sb16s'] + 5
      
})


#now get the new summary
int3_summary<- reactive({dataset %>%
        group_by(age_group) %>%
        summarise(original_cvd_count = sum(as.numeric(s723d)),
                  meanSBP = mean(sb16s, na.rm = T),
                  meanDBP = mean(sb16d, na.rm = T)) %>%
          mutate(new_cvd_count = newRisk(meanSBP, meanDBP) * original_cvd_count)
      })

output$summary1 =  renderTable({orig_summary()})
output$summary2 =  renderTable({int3_summary()})

但是我的summary1 和summary2 显示为相同(谈到meanSBP 列,它在summary2 中应该更高,因为我在行中添加了5)。我犯了什么错误,我该如何纠正?

标签: rshiny

解决方案


env返回子集。因此,在您的反应式汇总函数中,您应该使用env而不是dataset. 给你一个想法:


summary_func <- function(df){
         df %>%
          group_by(age_group) %>%
          summarise(original_cvd_count = sum(as.numeric(s723d)),
                    meanSBP = mean(sb16s, na.rm = T),
                    meanDBP = mean(sb16d, na.rm = T)) %>%
          mutate(new_cvd_count = newRisk(meanSBP, meanDBP) * original_cvd_count)
})

env <- reactive({
        req(dataset)
        popint1 <- round(input$pop * 0.01 * nrow(dataset)
        dataset[sample(nrow(dataset), popint1), 'sb16s'] <- dataset[sample(nrow(dataset), popint1, seed), 'sb16s'] + 5        
        return(dataset)
})

int3_summary<- reactive({
        env %>%
         summary_func
})


output$summary1 =  renderTable({dataset %>% summary_func})
output$summary2 =  renderTable({int3_summary()})

我无法测试代码,因此可能存在一些错误。下次请提供一个有效的最小示例。


推荐阅读