在操作按钮上从外部源反应性地获取新数据

时间:2016-05-17 10:10:57

标签: r reactive-programming shiny

我的目标是从googlesheet中检索数据并将其映射到传单地图上。
一切都工作正常,只有从googlesheet中检索数据的代码放在global.R中才会对运行的闪亮应用程序的那个会话有效。
但是,如果同时工作表是更新后,这些更新不会反映在正在运行的会话中。 所以我需要连接ui.R按钮以在每次触发按钮时获取新数据,并将数据传递到server.R中的相关代码。(我希望这很清楚)。< / p>

在我目前的设置中,数据从googlesheet下载(通过 global.R )并传递到环境并用于正在运行的应用会话。
这是我工作的闪亮应用程序设置:

ui.R

...
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))))

server.R

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
  })
#...
}

global.R

mydata <- gs_read(gs_key("0123456abcdabcd123123123"))


经过一些阅读和探索,我被告知我必须使用反应和observeEvent。但我错误的设置导致错误,说“对象”mydata“未找到”。
我在服务器上试过.R :(我知道下面的代码都有问题)

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

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

更新



在我的ui.R中,我也提到“画”,这也是错误。我应该怎么改变这个呢?我在问题中更新了ui.R中的行。这一行是ui.R行的一部分,它调用DT包来显示一些表。

顺便说一句,这个应用程序是基于superzip闪亮的应用程序 注意:我会为接受的答案给予100分奖励。

1 个答案:

答案 0 :(得分:5)

一般来说,observeobserveEvent不会返回任何值,而是用于副作用。因此,以下代码的这部分内容并未返回任何值,即使您使用<<-覆盖变量mydata,闪亮也不会知道其值已更改。

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

因此,如果您想知道数据何时更新,您应该在响应环境中阅读它。所以,不是通过global.R读取数据,而是建议在server.R中进行跟踪:

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

点击按钮后,会读取(新)数据,然后可以使用mydata()访问这些数据并传递给render*函数和代码的其他反应部分。例如:

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添加到updateSelectInput

的服务器功能中
shinyServer(function(input, output, session) {...} # added session 

2)将UI.R中的小部件选项设置为&#34;&#34;

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 ()
  })
相关问题