我在assign
中使用for loop
来创建我希望在闪亮ui中的多个输出中使用的新变量。以下是示例代码:
library(shiny)
ui <- fluidPage(
mainPanel(fluidRow(textOutput("a")),
fluidRow(textOutput("b")))
)
server <- function(input, output) {
m <- reactive({1:5})
output$a <- renderPrint({
for (i in 1:length(m())){
assign(paste0("h",i), "u")
}
list(h1,h2)
})
output$b <- renderPrint({
list(h1,h2)
})
}
shinyApp(ui = ui, server = server)
output
中的每个server
都有自己的环境。因此,变量h1
到h5
是在output a
内创建的,因此output b
无法访问。查看运行app的结果:
[[1]] [1] "u" [[2]] [1] "u"
[[1]] function (...) tags$h1(...) <environment: namespace:htmltools> [[2]] function (...) tags$h2(...) <environment: namespace:htmltools>
理想情况下,第二行应与第一行相同。如果我将for loop
移至server
,则存在反应性问题:
Error in .getReactiveEnvironment()$currentContext() :
Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
如何使for loop
被动,以便所有输出都可以访问它们?
我也试过在output
s之外做以下事情:
observe({for (i in 1:length(m())){
assign(paste0("om",i), "u")
}})
和
reactive({for (i in 1:length(m())){
assign(paste0("om",i), "u")
}})
由于h1
已经是闪亮的函数,我将对象名称更改为“om”。但是使用上述任何一种都不会产生好结果:
output$a <- renderPrint({
list(length(m()), om1)
})
output$b <- renderPrint({
om1()
})
Error: object 'om1' not found
Error: could not find function "om1"
答案 0 :(得分:2)
当我尝试在评论中转发时,将android:icon
移到第一个for loop
函数之外,因此h1-h5可用于renderPrint()
和output$a
。
从您的代码中,没有理由将循环仅限制为output$b
,因为其参数output$a
无论如何都是在外部定义的:
m