复制此问题的简单方法:
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”:
我认为这是由于Shiny设置依赖图的方式,但是name
不是一个反应变量,它在初始化期间可用。有没有办法可以强制评估for循环中的name
,类似于Haskell中的Bang Patterns?
答案 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。