【发布时间】:2020-11-30 17:15:53
【问题描述】:
在 R-Shiny 中。试图分解一个非常长的反应函数(数千行!)。 假设,是否可以嵌套条件反应函数,类似于:
STATE_filter <- reactive({
if(input$selectcounty ends with "-AL") {
run AL_filter()
}
else if (input$selectstate ends with "-AR"){
run AR_filter()
}
else {
return("ERROR")
}
})
编辑
非假设性地,我正在尝试根据美国县的用户选择输入创建一个嵌套的反应式过滤函数。在他们选择县后,一个 circlepackeR 图应该在模态对话框中弹出。这是我正在使用的数据:
dput(head(demographics))
structure(list(NAME = c("Autauga-AL", "Baldwin-AL", "Barbour-AL",
"Bibb-AL", "Blount-AL", "Bullock-AL"), STATE_NAME = c("AL", "AL",
"AL", "AL", "AL", "AL"), gender = structure(c(2L, 2L, 2L, 2L,
2L, 2L), .Label = c("female", "male"), class = "factor"), hispanic = structure(c(2L,
2L, 2L, 2L, 2L, 2L), .Label = c("hispanic", "nonhispanic"), class = "factor"),
race = structure(c(6L, 6L, 6L, 6L, 6L, 6L), .Label = c("asian",
"black", "islander", "native", "two or more", "white"), class = "factor"),
makeup = structure(c(2L, 2L, 2L, 2L, 2L, 2L), .Label = c("in combination",
"one race", "two or more"), class = "factor"), r_count = c(456L,
1741L, 114L, 96L, 320L, 44L), pathString = c("world/male/nonhispanic/white/one race",
"world/male/nonhispanic/white/one race", "world/male/nonhispanic/white/one race",
"world/male/nonhispanic/white/one race", "world/male/nonhispanic/white/one race",
"world/male/nonhispanic/white/one race")), row.names = c(NA,
6L), class = "data.frame")
这是我在下面使用的反应函数的示例。它是 10,000 多行的一小部分,我想先按州(阿拉巴马州的 AL,阿肯色州的 AR)拆分行来“嵌套”它,所以它是一段更简洁的代码。
demographics_filter <- reactive({
if(input$selectcounty == "Autauga-AL") {
race_autauga <- subset.data.frame(demographics, NAME=="Autauga-AL")
nodes_autauga <- as.Node(race_autauga)
}
else if(input$selectcounty== "Baldwin-AL") {
race_baldwinAL <-subset.data.frame(demographics, NAME=="Baldwin-AL")
nodes_baldwinAL<- as.Node(race_baldwinAL)
}
else if(input$selectcounty== "Ashley-AR") {
race_AshleyAR <-subset.data.frame(race, NAME=="Ashley-AR")
nodes_AshleyAR<- as.Node(race_AshleyAR)
}
else {
return("ERROR!")
}
})
最后,这是我的服务器中使用此功能的图表:
output$circle_graph_of_demographics <- renderCirclepackeR({
circlepackeR(demographics_filter(), size = "r_count"
})
【问题讨论】:
-
我不认为嵌套反应是可行的。您可以编写“常规函数”(接受“常规对象”)并将您需要的内容传递给它们。
-
反应式值可以返回反应式值。这不是问题。不过,没有
run声明之类的东西,只有return()反应值。所以return(AL_filter())。回答一个不太假设的问题会更容易,所以最好提供一个最小的reproducible example,我们可以用它来测试它是否有效。一般建议是将尽可能多的代码移到服务器函数之外,因此创建辅助函数是个好主意。 -
谢谢,我编辑了我的问题,所以它(希望)可以重现。
标签: r if-statement filter shiny reactive