更新由 eventReactive 在另一个 observeEvent 中创建的变量

Update variable created by eventReactive in another observeEvent

我正在努力用新数据在 observeEvent() 中更新使用 eventReactive() 创建的反应变量。

背景如下:我有一个 data.frame df,其中包含一些变量(xy)以及根据所选城市(创建的对于这个例子是随机的)。 xy 用零初始化。 因为我 need to further process df,我在 eventReactive().

中将 df 传递给 city_df

到目前为止,还不错。接下来,我想向 city_df 添加新数据。这个新数据的计算依赖于“计算”actionButton (input$compute),因此我在 observeEvent() 中更新了 city_df。我设法读取存储在 city_df 中的数据,但我正在努力覆盖其内容。 事实上,我有点不确定这是否可能,但我希望你们中的一些人能给我一些提示 如何用这个[中的新数据更新反应变量city_df =12=] 并在 app(?).

中评估其输出
library(shiny)

# global variables
cities <- c("Nairobi", "Kansas", "Uppsala", "Sangon", "Auckland", "Temuco")

# ui
ui <- fluidPage(
  fluidPage(
    fluidRow(
      column(2,
             selectInput("city", "Select city",
                         choices = cities,
                         selected = sample(cities,
                                           size = 1)
             ),
             actionButton("compute",
                          "Compute")),
      column(8,
             verbatimTextOutput("the_city"))
    ))
)

# server
server <- function(input, output, session) {
  # create variable
  city_df <- eventReactive(input$city, {
    len <- round(runif(1, 20, 50), 0)
    df <- data.frame(city = rep(input$city, len))
  # initialize x and y with zeros
    df <- cbind(df,
                data.frame(x = rep.int(0, len),
                           y = rep.int(0, len)))
  })

  output$the_city <- renderText({
    paste(city_df())
  })

  observeEvent(input$compute, {
    # grab data
    test <- city_df()
    # compute new data
    test$x <- runif(dim(test)[1], 11, 12)
    test$y <- runif(dim(test)[1], 100, 1000)
    # and how to send this values back to city_df?
  })
  }

# run app
shinyApp(ui, server)

实际的应用程序要复杂得多——如果这个 MWE 应用程序看起来有点过于复杂以实现这个通常很简单的任务,请原谅我(我希望我设法在 MWE 中表示更复杂的情况)。 我正在解析 GeoPackage 的层,而不是 data.frame,并附加一些用零初始化的变量。所选图层显示在 Leaflet 地图中。按下“计算”按钮后,一个函数会计算我希望添加到图层的新数据,然后将其显示在地图上。 我想到的替代解决方案是将新数据写入 GeoPackage,然后重新读取该层。但是,如果我能避免这种弯路,我将不胜感激,因为加载图层需要一些时间...

非常感谢:)

而不是使用 eventReactive,如果您使用适当的 reactiveVal,那么您可以随时更改值。这就是它的样子

server <- function(input, output, session) {
  # create variable
  city_df <- reactiveVal(NULL)

  observeEvent(input$city, {
    len <- round(runif(1, 20, 50), 0)
    df <- data.frame(city = rep(input$city, len))
    # initialize x and y with zeros
    df <- cbind(df,
                data.frame(x = rep.int(0, len),
                           y = rep.int(0, len)))
    city_df(df)
  })
  
  output$the_city <- renderText({
    paste(city_df())
  })
  
  observeEvent(input$compute, {
    # grab data
    test <- city_df()
    test$x <- runif(dim(test)[1], 11, 12)
    test$y <- runif(dim(test)[1], 100, 1000)
    city_df(test)
  })
}

因此调用 city_df() 获取当前值并调用 city_df(newval) 使用新值更新变量。我们只需将 eventReactive 换成 observeEvent 并自己进行更新。