【问题标题】:Shiny: create a reactiveValues from a list of namesShiny:从名称列表中创建一个 reactiveValues
【发布时间】:2018-07-04 10:02:29
【问题描述】:

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

假设我有一个列表x

x <- lapply(LETTERS, function(i) TRUE)
names(x) <- LETTERS

我能否从x 生成一个reactiveValues rv,其行为类似于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)

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

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    一个简单的方法是调用你的向量作为函数 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)
    

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

    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 = "-")
      }
      )
    }
    

    【讨论】:

    • 很好,我喜欢那个解决方案。这就是我想要的,一个摆脱 for 循环的单行代码。谢谢!
    • 自回答以来已经有一段时间了,但是有没有办法保持字母顺序? do.call之后的当前顺序是names(reactiveValuesToList(rv)) [1] "E" "C" "D" "I" "J" "G" "F" "H" "B" "A"
    • 不幸的是,我认为没有优雅的方法可以这样做;这可能是由于 reactiveValues 的内部功能。我不确定该函数是否具有任何 order 属性。我的建议是调用原始列表来重新排序所需的列表。例如,查看编辑
    • 更正了编辑!
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多