如何使用 Flexdashboard 和 Shiny "correctly" 将 Web 服务中的数据加载到 Rmarkdown 中的仪表板中?

How to "correctly" load data from a web service into a dashboard in Rmarkdown with Flexdashboard and Shiny?

我有一个关于如何将数据从 Web 服务正确加载到我正在构建仪表板的 rmarkdown 文件中的问题。

基本上,我有一个 rmd 文件,我在其中使用 Flexdashboard 和 Shiny 构建仪表板。我有几个“r 块”,我在其中放置地图(传单)、表格(DT)和各种图(ggplot2 和 plotly)。

目前,我正在通过类似

的网络服务读取数据

www.somewebpage.com/project1/service.py?parameter1=2020&parameter2=ABC

我使用 Shiny 更改参数,它总是 returns 一个 JSON 具有不同的数据。到目前为止,我在每个“r 块”中处理 Web 服务,在显示地图、表格或图表之前将其转换为数据框。

我的问题是,是否可以只处理一次参数的变化,只生成一个数据帧,供Rmd文件中的每个“r chunk”读取?

====

我的 Rmd 文件中的示例:

{r Chunk1-map, echo = FALSE}

renderLeaflet({
WebService <-  "www.somewebpage.com/project1/service.py?parameter1=2020&parameter2=ABC"
dataURL <- urltools::param_set(urls = WebService, key = "parameter1", value = input$parameter1)   
dataURL <- urltools::param_set(urls = dataURL, key = "parameter2", value = input$parameter2)
resp <- httr::GET(dataURL)
jsonRespText <- content(resp, as = "text")
        jsonRespParsed <- content(resp,as="parsed")
        df_json <- jsonlite::fromJSON(jsonRespText)
        modJson <- jsonRespParsed$Data

df <- modJson %>% bind_rows %>% dplyr::select(var1, var2, var3, var4, var5)

# Below is the code to make a leaflet map with the Data Frame "df".
})

=====

{r Chunk2-data-table, echo = FALSE}

renderDT({
WebService <-  "www.somewebpage.com/project1/service.py?parameter1=2020&parameter2=ABC"
dataURL <- urltools::param_set(urls = WebService, key = "parameter1", value = input$parameter1)   
dataURL <- urltools::param_set(urls = dataURL, key = "parameter2", value = input$parameter2)
resp <- httr::GET(dataURL)
jsonRespText <- content(resp, as = "text")
        jsonRespParsed <- content(resp,as="parsed")
        df_json <- jsonlite::fromJSON(jsonRespText)
        modJson <- jsonRespParsed$Data

df <- modJson %>% bind_rows %>% dplyr::select(var1, var2, var3, var4, var5)

# Below is the code to make a data table with the Data Frame "df".
})

====

{r Chunk3-scatterplot, echo = FALSE}

renderD3scatter({
WebService <-  "www.somewebpage.com/project1/service.py?parameter1=2020&parameter2=ABC"
dataURL <- urltools::param_set(urls = WebService, key = "parameter1", value = input$parameter1)   
dataURL <- urltools::param_set(urls = dataURL, key = "parameter2", value = input$parameter2)
resp <- httr::GET(dataURL)
jsonRespText <- content(resp, as = "text")
        jsonRespParsed <- content(resp,as="parsed")
        df_json <- jsonlite::fromJSON(jsonRespText)
        modJson <- jsonRespParsed$Data

df <- modJson %>% bind_rows %>% dplyr::select(var1, var2, var3, var4, var5)

# Below is the code to make a scatter plot with the Data Frame "df".
})

对于使用相同网络服务的每个元素依此类推。

是否需要在每个“r 块”中处理 Web 服务?

我回答我的问题。

只需读取一个 {r chunk} 中的 Web 服务和生成的数据框,我将其设为响应式,如下所示。

尽管出于某种原因用户输入必须在相同的 {r chunk} (暂时).

{r inputs-data, echo=FALSE}

inputPanel(
        selectInput(inputId = "parameter1", label = "Parameter 1", 
                     choices = choices1, selected = "2020"),
        selectInput(inputId = "parameter2", label = "Parameter 2", 
                     choices = choices2, selected = "ABC"),
        actionButton(inputId = "params", label = "Go", 
                     class = "btn btn-primary btn-block") 
)


myData <- reactive({
        input$params # ACTION BUTTON
        
        WebService <-  "www.somewebpage.com/project1/service.py?parameter1=2020&parameter2=ABC"
        dataURL <- isolate(urltools::param_set(urls = WebService, 
                                               key = "parameter1", 
                                               value = input$parameter1))
        dataURL <- isolate(urltools::param_set(urls = dataURL, 
                                               key = "parameter2", 
                                               value = input$parameter2))
        resp <- httr::GET(dataURL)
        jsonRespText <- httr::content(resp, as = "text")
        jsonRespParsed <- httr::content(resp, as="parsed")
        df_json <- jsonlite::fromJSON(jsonRespText)
        modJson <- jsonRespParsed$Data
        
        df <- modJson %>% bind_rows %>% dplyr::select(var1, var2, var3, var4, var5)

在此之后,可以使用 myData().

访问所有 {r chunks} 中的反应数据帧

例如:

{r data-table, echo=FALSE}
renderDT({
  A <-  DT::datatable(data = myData())
  A
})

输出如下图所示。

图像顶部显示的传单地图也是使用相同的反应数据框制作的。

你好。