如何在R中的闪亮服务器中进行循环反应?

时间:2015-09-03 03:23:07

标签: r shiny

我在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都有自己的环境。因此,变量h1h5是在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"

1 个答案:

答案 0 :(得分:2)

当我尝试在评论中转发时,将android:icon移到第一个for loop函数之外,因此h1-h5可用于renderPrint()output$a

从您的代码中,没有理由将循环仅限制为output$b,因为其参数output$a无论如何都是在外部定义的:

m