R Markdown Shiny renderPlot来自lapply的情节列表

时间:2016-04-22 17:22:05

标签: shiny r-markdown lapply openair

我正在开发一个R Markdown Shiny文档:

  1. 子集数据框以包含“日期”列和一些数字数据列。设置闪亮的用户输入的方式,您选择要包括的数据列的单选按钮,然后点击“子集数据”按钮创建d() - 没有问题:)
  2. 生成一个图表列表(plotList),每个数字数据列一个(根据日期列绘制)。我使用openairtimePlot函数生成绘图,lapply生成绘图对象列表(plotList) - 没有问题:)
  3. 使用renderPlotplotList中的所有图表输出到R Markdown文档 - 问题:(
  4. 我知道有类似的问题(例如https://gist.github.com/wch/5436415/Reactivity in R shiny with toy exampledynamically add plots to web page using shiny),请相信我,我已经尝试过(例如使用for循环代替lapply-不是我的偏好,但如果它工作那么谁在乎;添加local()和/或observe();等)。无论我做什么,我都无法上班。我是R Markdown和Shiny的新手,我只是想不出来 - 请帮忙!

    这是一个可重现的例子(作为R markdown闪亮文档运行)。

    首先创建反应数据集d()的块:

    ```{r reactive-dataset, echo=FALSE,message=FALSE}
    library(openair)
    library(dplyr)
    data<-mydata[1:50,]
    print(tbl_df(data))
    
    inputPanel(
      checkboxGroupInput(inputId="p",
                    label="select pollutants to plot",
                    choices=names(data)[-1]
                  ),
      actionButton(inputId="import",
                   label="Subset Data")
    )
    
    
    d<-eventReactive(input$import,{
      d<-data %>% select(date,one_of(input$p))
      })
    
    renderPrint({tbl_df(d())})
    ```
    

    现在是第二个块,创建plotList并输出它(部分不工作):

    尝试1:仅显示最后一个图

     ```{r plot,echo=FALSE,message=FALSE}
     renderPlot({
      i<-names(d())[-1]
      tp<-function(x){
        p<-timePlot(d(),
             pollutant=print(x),
             main="Minute Validation",
             ylab="Minute Conc. (ug/m3 or ppb)",
             key=T)
        p$plot
        }
      lapply(i,tp)
    
      }) 
      ``` 
    

    尝试2(基于Reactivity in R shiny with toy example)。没有显示图表

    ```{r plot,echo=FALSE,message=FALSE}
    plotList<-reactive({
      i<-names(d())[-1]
      tp<-function(x){
        p<-timePlot(d(),
             pollutant=print(x),
             main="Minute Validation",
             ylab="Minute Conc. (ug/m3 or ppb)",
             key=T)
        p$plot
        }
      lapply(i,tp)
      })
    
    
    observe({
      for (j in 1:length(plotList())){
        local({
          my_j<-j
          renderPlot({plotList()[[my_j]]})
    
          })#end local
        } #end for loop
    }) #end observe
    ```
    

    我无休止地摆弄这个问题,提到我与上述相关的类似问题。

1 个答案:

答案 0 :(得分:0)

[新答案]

我终于解决了这个问题。关键是要完全按照帖子的第三个链接中的示例,首先使用renderUI!

```{r plot,echo=FALSE,message=FALSE}
tp_list <- reactive({
  i<-names(d())[-1]
  tp<-function(x){
    p<-timePlot(d(),
         pollutant=print(x),
         main="Minute Validation",
         ylab="Minute Conc. (ug/m3 or ppb)",
         key=T)
    p$plot
  }
  lapply(i, tp)
}) 

renderUI({
    plot_output_list <- lapply(1:length(tp_list()), function(i) {
        plotname <- paste("plot", i, sep="")
        plotOutput(plotname)
    })
    do.call(tagList, plot_output_list)
})

observe({
for (i in 1:length(tp_list())) {
    local({
        my_i <- i
        plotname <- paste("plot", my_i, sep="")
        output[[plotname]] <- renderPlot({
            tp_list()[[my_i]]
        })
    })
}
})
```

[基于格子面板的原始答案]

这不完全是你想要的,但我把所有的情节都显示在一个情节中。

```{r plot,echo=FALSE,message=FALSE}
renderPlot({
  i<-names(d())[-1]
  tp<-function(x){
    p<-timePlot(d(),
         pollutant=print(x),
         main="Minute Validation",
         ylab="Minute Conc. (ug/m3 or ppb)",
         key=T)
    p$plot
  }
  tp(i)
}) 
```