Shiny中如何在if-else语句中分别命名不同响应式数据框
解决方案
你可以将两个分支的逻辑分别封装为独立的响应式对象test1和test2,这样既能保留原有的df3逻辑,又能在其他地方直接引用这两个结果:
- 单独定义
test1:处理df1_b的num1列加10的逻辑 - 单独定义
test2:执行df2与df1_a_grouped的左连接操作 - 在
df3中根据条件返回对应的响应式结果
修改后的Server代码
server <- function(input, output, session) { ## df1 # reactive df1 <- reactive({ data.frame( # "id" = c("A", "A", "A", "B"), "id" = c("A", "A", "A", "A"), "num1" = c(10, 11, 12, 13) ) }) # renderReactable output$table1 <- renderReactable({ reactable(df1(), borderless = F, defaultColDef = colDef(align = "center")) }) ## df2 # reactive df2 <- reactive({ data.frame( "id" = c("A", "A", "B"), "num2" = c(14, 15, 16) ) }) # renderReactable output$table2 <- renderReactable({ reactable(df2(), borderless = F, defaultColDef = colDef(align = "center")) }) ## df1_a # reactive df1_a <- reactive({ df1() %>% filter(id == "A") }) ## df1_b # reactive df1_b <- reactive({ df1() %>% filter(id == "B") }) ## df1_a_grouped <- reactive({ df1_a() %>% group_by(id) %>% summarise( sum_num1 = sum(num1) ) }) ## 定义test1和test2响应式对象 test1 <- reactive({ df1_b() %>% mutate(num1_addten = num1 + 10) }) test2 <- reactive({ # 修正:dplyr的left_join使用by参数而非on left_join(df2(), df1_a_grouped(), by = "id") }) ## df3 df3 <- reactive({ if (nrow(df1_b()) > 0) { test1() } else { test2() } }) # 示例:在其他地方引用test1或test2 # output$test1_table <- renderReactable({ # reactable(test1(), borderless = F) # }) }
说明
test1和test2都是响应式对象,会自动依赖其上游的响应式数据(如df1_b、df2等),当上游数据变化时自动更新- 你可以在Server的任何其他地方直接通过
test1()或test2()引用这两个结果,无需重复编写逻辑 - 修正了原代码中
left_join的参数错误(将on改为by,符合dplyr的语法规范)
内容的提问来源于stack exchange,提问作者shsh
相关产品推荐
相关产品推荐

