我正在尝试创建一个具有Sankey图和selectInput的仪表板,让最终用户选择过滤源列。我在尝试弄清楚如何使用反应性表达式过滤数据时遇到麻烦。这有点复杂,因为它不仅是读取数据的第一步,还需要进行预处理。我已经尝试将电抗滤波器放在最后,但它不起作用,如下所示。我还尝试使每个步骤都具有反应性,但这肯定是行不通的。
从某种意义上来说,这是行不通的:1)仪表板已加载,但没有图(应该是schname的默认值/第一个值)和2)当我选择另一个schname时,它给出了一个“闭包类型的对象”不可子集”错误。我认为这意味着我对反应式表达的处理方式有误,但是我还没有从所有搜索中弄清楚。
代表:
library(shiny)
ui <- fluidPage(
selectInput(inputId = "school",
label = "School",
choices = c("alpha", "echo")),
sankeyNetworkOutput("diagram")
)
server <- function(input, output) {
dat <- data.frame(schname = c("alpha", "alpha", "alpha", "echo"),
next_schname = c("bravo", "charlie", "delta", "foxtrot"),
count = c(1, 5, 3, 4))
links <- data.frame(source = dat$schname,
target = dat$next_schname,
value = dat$count)
nodes <- data.frame(name = c(as.character(links$source),
as.character(links$target)) %>%
unique)
links$IDsource <- match(links$source, nodes$name) - 1
links$IDtarget <- match(links$target, nodes$name) - 1
links <-reactive({
links %>%
filter(source == input$school)
})
output$diagram <- renderSankeyNetwork({
sankeyNetwork(
Links = links,
Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
NodeID = "name",
sinksRight = FALSE
)
})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:1)
我认为在反应性和非反应性数据帧之间分隔links
的对象名称很重要。其次,对于render函数,您希望像函数一样调用反应对象:links()
。第三,确保为应用程序加载了所有依赖项。
例如:
library(shiny)
library(networkD3)
library(dplyr)
ui <- fluidPage(
selectInput(inputId = "school",
label = "School",
choices = c("alpha", "echo")),
sankeyNetworkOutput("diagram")
)
server <- function(input, output) {
dat <- data.frame(schname = c("alpha", "alpha", "alpha", "echo"),
next_schname = c("bravo", "charlie", "delta", "foxtrot"),
count = c(1, 5, 3, 4))
links <- data.frame(source = dat$schname,
target = dat$next_schname,
value = dat$count)
nodes <- data.frame(name = c(as.character(links$source),
as.character(links$target)) %>%
unique)
links$IDsource <- match(links$source, nodes$name) - 1
links$IDtarget <- match(links$target, nodes$name) - 1
links2 <-reactive({
links %>%
filter(source == input$school)
})
output$diagram <- renderSankeyNetwork({
sankeyNetwork(
Links = links2(),
Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
NodeID = "name",
sinksRight = FALSE
)
})
}
shinyApp(ui = ui, server = server)