R闪亮-有可能嵌套反应函数吗



在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")

下面是我使用的反应函数的一个例子。这是10000+行的一个子集,我想;巢;它首先按州(阿拉巴马州为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"
})  

就个人而言,如果单个函数/反应函数有1000行长,那么通过重构肯定有改进的空间!

你给我们的NULLreactive有一点我觉得很奇怪,那就是它在有效数据的情况下返回"ERROR!",在无效数据的情况中返回output$circle_graph_of_demographics,所以我不确定你如何在eventReactive(input$selectcounty, {...})中成功使用它。如果您不需要它来返回任何东西,那么input$selectcounty可能更合适?

看起来您需要根据对Autauga-Al值的更改创建一个(一组(节点和一个(组(过滤后的数据帧。当Baldwin-ARdemographics_filter0时,为什么需要input$selectcounty的节点和子集还不清楚,这就是为什么我把";一组";括号中。

根据你告诉我们的(如果没有MWE,就不可能确定什么能满足你的需求(,我会做一些类似的事情:

v <- reactiveValues(
demographics_filter=list(),
demographics_nodes=list()
)
eventReactive(input$selectcounty, {
req(input$selectcounty)
v$demographics_filter[[input$selectcounty]] <- subset.data.frame(demographics, NAME==input$selectcounty)
v$demographics_node[[input$selectcounty]] <- as.Node(v$demographics_filter[[input$selectcounty]])
})

它应该提供一个紧凑的解决方案,对于县和州名称的变化是稳健的。如果我理解正确的话,这将用七行代替你成千上万的行。显然,您可能需要重构代码的其余部分,以考虑您的更改。

如果你确实需要一组经过过滤的数据帧和节点,那么我会这样做:

### ALABAMA FILTER
al_filter <- reactive({
if(input$selectcounty == "Autauga-AL") {
demographics_autauga <- subset.data.frame(demographics, NAME=="Autauga-AL")
nodes_autauga <- as.Node(demographics_autauga)
} 
else {
return("ERROR2")
}
})
##### ARKANSAS FILTER
ar_filter <- reactive ({
if(input$selectcounty== "Arkansas-AR") {
demographics_ArkansasAR <-subset.data.frame(demographics, NAME=="Arkansas-AR")
nodes_ArkansasAR<- as.Node(demographics_ArkansasAR)
}   
else {
return("ERROR2")
}
})
##### STATES FILTER
demographics_filter <- reactive({
if(grepl("-AL", input$selectcounty)){
return(al_filter())
}
else if (grepl("-AR", input$selectcounty)){
return (ar_filter())
}
else {
return(" ERROR")
}
})

同样,这是一个紧凑、健壮的解决方案,您可能需要在其他地方重构代码以考虑这些变化。

我所有的代码都没有经过测试,因为我没有MWE可以使用。

明白了!

是的,你(我(可以嵌套反应函数。

PD_8

最新更新