更新由 eventReactive 在另一个 observeEvent 中创建的变量
Update variable created by eventReactive in another observeEvent
我正在努力用新数据在 observeEvent()
中更新使用 eventReactive()
创建的反应变量。
背景如下:我有一个 data.frame df
,其中包含一些变量(x
和 y
)以及根据所选城市(创建的对于这个例子是随机的)。
x
和 y
用零初始化。
因为我 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
并自己进行更新。
我正在努力用新数据在 observeEvent()
中更新使用 eventReactive()
创建的反应变量。
背景如下:我有一个 data.frame df
,其中包含一些变量(x
和 y
)以及根据所选城市(创建的对于这个例子是随机的)。
x
和 y
用零初始化。
因为我 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
并自己进行更新。