R来自for循环变量的Shiny bad依赖。有没有办法强制评估?

时间:2017-05-03 14:11:56

标签: r shiny

复制此问题的简单方法:

shinyApp(
  ui = fluidPage(
    textOutput("helloJohn"),
    br(),
    textOutput("helloJacob"),
    br(),
    textOutput("helloJoe")),  
  server = function(session, input, output) {
    for(name in c("John", "Jacob", "Joe")) {
      output[[paste0("hello", name)]] <- renderText({paste0("hello ", name, "!")})
    }
  })

此代码的目的是让页面上出现“Hello John”,“Hello Jacob”,“Hello Joe”,而不必重用renderText块。但是,虽然看起来输出名称设置正确,但在渲染时似乎name被设置为for循环中的最后一个值,导致所有名称都是“Joe”:

All Joe!

我认为这是由于Shiny设置依赖图的方式,但是name不是一个反应变量,它在初始化期间可用。有没有办法可以强制评估for循环中的name,类似于Haskell中的Bang Patterns?

1 个答案:

答案 0 :(得分:2)

您可以在local中包含for循环中的内容,并创建一个接收name2的本地变量name

for(name in c("John", "Jacob", "Joe")) {
  local({
  name2 <- name
  output[[paste0("hello", name2)]] <- renderText({paste0("hello ", name2, "!")})
  })
}

此答案的其他信息和灵感here