簡體   English   中英

如何使用 Flexdashboard 和 Shiny 將 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)。

目前,我正在通過 web 服務讀取數據,例如

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

我使用 Shiny 更改參數,它總是返回具有不同數據的 JSON。 到目前為止,我在每個“r 塊”中處理 web 服務,在顯示地圖、表格或圖表之前將其轉換為數據框。

我的問題是,是否可以只處理一次參數更改並僅生成一個數據幀,Rmd 文件中的每個“r 塊”都可以讀取?

====

我的 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".
})

對於使用相同 web 服務的每個元素,依此類推。

是否需要在每個“r chunk”中處理 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
})

output 如下圖所示。

數據表

圖像頂部顯示的 leaflet map 也是使用相同的反應數據框制成的。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM