![](/img/trans.png)
[英]Comparison Shiny / rmarkdown::render_site() & flexdashboard
[英]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¶meter2=ABC
我使用 Shiny 更改參數,它總是返回具有不同數據的 JSON。 到目前為止,我在每個“r 塊”中處理 web 服務,在顯示地圖、表格或圖表之前將其轉換為數據框。
我的問題是,是否可以只處理一次參數更改並僅生成一個數據幀,Rmd 文件中的每個“r 塊”都可以讀取?
====
我的 Rmd 文件中的示例:
{r Chunk1-map, echo = FALSE}
renderLeaflet({
WebService <- "www.somewebpage.com/project1/service.py?parameter1=2020¶meter2=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¶meter2=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¶meter2=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¶meter2=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.