gpt4 book ai didi

在操作按钮上被动地从外部源获取新数据

转载 作者:行者123 更新时间:2023-12-04 10:54:34 27 4
gpt4 key购买 nike

我的目标是从 googlesheet 检索数据并将其映射到传单 map 上。
一切正常,仅当从 googlesheet 检索数据的代码放置在 global.R 中并且它仅对正在运行的 Shiny 应用程序的该 session 有效时。但是,如果同时更新工作表,则这些更新不会反射(reflect)在正在运行的 session 中。 所以我需要连接一个 ui.R 按钮以在每次触发按钮时获取新数据并将数据传递到 server.R 中的相关代码。 (我希望这很清楚)。

在我当前的设置中,数据从 googlesheet 下载(通过 global.R )并传递到环境并用于正在运行的应用程序 session 。

这是我工作 Shiny 的应用程序设置:

用户界面

...
leafletOutput("map"),
actionButton("button", "Get New Data")
...
#added the below lines to update the question:
selectInput("Country",
"Country:",
c("All",
unique(as.character(draw$Country))))

服务器
shinyServer(function(input, output, session) {
#...
output$map <- renderLeaflet({
#... some options here
})
draw <- mydata
drawvalue <- reactive({
if (input$year == year1){return(mydata)} else {
filtered <- filter(mydata, Type == input$type1)
return(filtered)
}
})
observe({
#... some other variable definitions
colorBy <- input$color ##added to update the question
sizeBy <- input$size ##added to update the question

draw <- drawvalue()
colorData <- draw[[colorBy]] ##added to update the question

#... code related to the leaflet
})
#...
}

全局R
mydata <- gs_read(gs_key("0123456abcdabcd123123123"))

经过一些阅读和探索,我被告知必须使用reactive 和observeEvent。但是我错误的设置导致错误,说'找不到对象“mydata”'。

我在 server.R 中尝试过:(我知道下面的代码都是错误的)
observeEvent(input$button,{
mydata <- gs_read(gs_key("0123456abcdabcd123123123"))
})

mydata <- eventReactive(input$button,{
mydata()
})

更新:

在我的 ui.R 中,我也提到了“draw”,这也是错误的。我该如何改变这个?我在上面的问题中更新了 ui.R 中的行。此行是调用 DT 包以显示一些表格的 ui.R 行的一部分。

顺便说一下,这个应用程序是基于 superzip Shiny 的应用程序。
注意:对于接受的答案,我将奖励 100 分。

最佳答案

通常 observeobserveEvent 不返回任何值,它们用于副作用。因此,下面这部分代码不会返回任何值,即使您使用 <<- 覆盖变量 mydata Shiny 也不知道其值已更改。

observeEvent(input$button,{
mydata <- gs_read(gs_key("0123456abcdabcd123123123"))
})

因此,如果您想知道数据何时更新,您应该在响应式(Reactive)环境中阅读它。因此,我建议不要通过 global.R 读取数据,而是在 server.R 中执行以下操作:
mydata <- eventReactive(input$button, {
gs_read(gs_key("0123456abcdabcd123123123"))
})

单击按钮后,shiny 将读取(新)数据,然后可以使用 mydata() 访问这些数据并传递给 render* 函数和代码的其他 react 部分。例如:
drawvalue <- reactive({
if (input$year == year1){return(mydata() )} else { # added ()
filtered <- filter(mydata(), Type == input$type1) # added () to mydata
return(filtered)
}
})

你必须改变这部分代码
draw <- drawvalue()


draw <- reactive({ drawvalue() })

然后使用 draw() 访问它

更新 :

如果您想根据 selectInput 从 UI.R 选择小部件 draw,您可以执行以下操作:

1)在 session的server函数中添加参数 updateSelectInput
shinyServer(function(input, output, session) {...} # added session 

2) 将 UI.R 中小部件的选择设置为“”
selectInput("Country", "Country:", choices = "")

3)更新服务器端的选择:
observe({
req(draw()) # require that draw is available
updateSelectInput(session, "Country", "Country:",
c("All", unique(as.character(draw()$Country)))) # added ()
})

关于在操作按钮上被动地从外部源获取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273164/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com