如何使用 Shiny 在 R 中使局部变量成为全局变量?

How to make a local variable global in R using Shiny?

这是我第一次使用 Shiny,如果这太基础了,请见谅。

我有一个名为 some_global_function() 的全局函数,每当按下名为 ok_inputactionButton 时,我都会调用它。这将创建一个名为 algorithm_output.

的局部变量

现在,我希望能够在按下 另一个 actionButton (ok_means) 时访问该变量,但不调用函数 some_global_function() 再次。

有办法吗?代码将是这样的:

server <- function(input, output) {
  out_plots <- eventReactive(input$ok_input, {

    #### I call the function here and this is the variable I want
    #### to make global ########################################
    algorithm_output = some_global_function(3, 2, 1)

    do.call("grid.arrange", c(algorithm_output$indexes, nrow=3))
  })

  output$indexes <- renderPlot({
    out_plots()
  })

  out_means <- eventReactive(input$ok_means, {
    k = as.integer(input$k)

    #### I want to access the variable here ################
    matplot(algorithm_output$means[[k-1]], type = "l", lty=1)
    ########################################################

  })
  output$means <- renderPlot({
    out_means()
  })
}

只需在任何子函数之外创建变量并使用 <<- 更新其值。该变量对于每个会话都是全局的。

server <- function(input, output) {

  # init variable here
  algorithm_output <- NULL

  out_plots <- eventReactive(input$ok_input, {

    # to modify a global variable use <<- instead of <- or =
    algorithm_output <<- some_global_function(3, 2, 1)

    do.call("grid.arrange", c(algorithm_output$indexes, nrow=3))
  })

  output$indexes <- renderPlot({
    out_plots()
  })

  out_means <- eventReactive(input$ok_means, {
    k = as.integer(input$k)

    # you can get access to the updated value of your variable
    matplot(algorithm_output$means[[k-1]], type = "l", lty=1)

  })
  output$means <- renderPlot({
    out_means()
  })
}