r - 使用反应性元素更改非反应性数据框的问题
问题描述
我正在与 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)。我犯了什么错误,我该如何纠正?
解决方案
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()})
我无法测试代码,因此可能存在一些错误。下次请提供一个有效的最小示例。
推荐阅读
- amazon-web-services - Aws-vault:无法获取凭据 - InvalidClientTokenId:请求中包含的安全令牌无效
- javascript - 打破包含异步操作的无限循环
- oracle - Oracle 到 Postgres 的转换将游标作为参数传递
- javascript - 反应状态下的许多布尔属性 - 如何重构?
- python - 尝试根据条件在电子邮件中附加 pdf 时,Django 文件不存在错误
- reactjs - react-hook 组件形式中的 initialValues
- web-scraping - 如何限制 BeautifulSoup 找到的元素数量?
- css - 如何在 ACE 编辑器中优化调整大数据的大小?
- path - “/”和“./”有什么区别?
- node.js - 如何使用 `Notification` 对象向 vuejs 中离线的用户发送通知?