Shiny:从名称列表创建一个reactiveValues

klu*_*luu 5 r shiny

是否可以生成一个reactiveValues变量名称由某个列表给出的变量list_of_names?例如,这些变量可以存储指示相应变量的状态的布尔值。

想象一下我有一个清单x

x <- lapply(LETTERS, function(i) TRUE)
names(x) <- LETTERS
Run Code Online (Sandbox Code Playgroud)

我可以生成一个reactiveValues rv行为x类似的x吗?

我没能做到这一点,我能想到的就是这样的:

ui <- fluidPage(
  textOutput("boolean")  
)

server = function(input, output, session){
  nms <- LETTERS[1:10]

  ### lines that I would change
  rv <- reactiveValues(A = TRUE)
  for (n in nms) {rv[[n]] <- TRUE}
  ###

  output$boolean <- renderText(rv[["D"]])
}

shinyApp(ui,server)
Run Code Online (Sandbox Code Playgroud)

它有效,但我确信必须有一种更简单且“更干净”的方法来做到这一点,因为xrv非常相似。感谢任何可以在这方面帮助我的人。

Lev*_*ian 7

一种简单的方法是将向量作为函数reactiveValues的参数调用:

ui <- fluidPage(
  textOutput("boolean")  
)

server = function(input, output, session){
  x <- as.list(rep(T,10))
  names(x) <- LETTERS[1:10]
  
  # x as arguments of reactiveValues function
  rv <- do.call("reactiveValues",x)
  
  # still works
  output$boolean <- renderText(rv[["D"]])
}

shinyApp(ui,server)
Run Code Online (Sandbox Code Playgroud)

编辑:对我来说,不可能保持向量的原始顺序。另一种方法是将其保存在其他地方(如果可能),然后在需要时调用它:

ui <- fluidPage(
  textOutput("boolean")  
)

server = function(input, output, session){
  x <- as.list(rep(T,10))
  names(x) <- rev(LETTERS[1:10])
  true_order <- levels(factor(names(x),names(x)))
  
  # x as arguments of reactiveValues function
  rv <- do.call("reactiveValues",x)
  
  # still works
  output$boolean <- renderText({
    p <- names(x)
    paste0(p[sapply(true_order,function(x,p){which(p == x)},p=p)], collapse = "-")
  }
  )
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,很好,我喜欢这个解决方案。这就是我想要的,一个摆脱 for 循环的单行代码。谢谢! (2认同)