Shiny R Markdown Shining renderPlot来自Lappy的绘图列表

Shiny R Markdown Shining renderPlot来自Lappy的绘图列表,shiny,r-markdown,lapply,openair,Shiny,R Markdown,Lapply,Openair,我正在开发一个R降价文档,以便: 将数据框子集以包括“日期”列和一些数字数据列。按照设置闪亮用户输入的方式,选择要包含的数据列的单选按钮,然后点击“子集数据”按钮创建d()-没问题:) 生成打印列表(plotList),每个数字数据列对应一个打印列表(根据日期列打印)。我正在使用openair软件包timePlot功能生成绘图,并使用lappy生成绘图对象列表(plotList)-没问题:) 使用renderPlot将plotList中的所有绘图输出到R标记文档-问题:( 我知道也有类似的问题(

我正在开发一个R降价文档,以便:

  • 将数据框子集以包括“日期”列和一些数字数据列。按照设置闪亮用户输入的方式,选择要包含的数据列的单选按钮,然后点击“子集数据”按钮创建
    d()
    -没问题:)
  • 生成打印列表(
    plotList
    ),每个数字数据列对应一个打印列表(根据日期列打印)。我正在使用
    openair
    软件包
    timePlot
    功能生成绘图,并使用
    lappy
    生成绘图对象列表(
    plotList
    )-没问题:)
  • 使用
    renderPlot
    plotList
    中的所有绘图输出到R标记文档-问题:(
  • 我知道也有类似的问题(例如,和),请相信我,我已经尝试了又尝试(例如,使用for循环代替lappy不是我的首选,但如果它起作用,那么谁会在乎;添加local()和/或observe();等等).无论我做什么,我都无法让它工作。我对R Markdown和Shinny都是新手,我就是搞不懂-请帮帮我

    下面是一个可复制的示例(将作为R标记文档运行)

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

    尝试2(基于)。不显示任何绘图

     ```{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)
    
      }) 
      ``` 
    
    ```{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
    ```
    
    `{r plot,echo=FALSE,message=FALSE}
    绘图列表[新答案]

    我终于解决了这个问题。关键是要完全遵循你文章第三个链接中的例子,首先使用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}
    
    感谢您的尝试。我可以通过在timePlot中使用
    pollutant=names(d())[-1]
    作为参数并删除函数
    tp
    来生成与上面相同的绘图。这对我不起作用的原因是,我需要根据日期(>10)绘制多列数据将它们作为单独的面板放在一个绘图中是不可取的,数据会被压缩。我需要将它们放在单独的绘图中。你可以设置图像高度,根据面板的数量动态调整。用一个完全有效的示例,多个绘图更新了我的答案!是的!!!我不完全理解renderUI的功能,但它可以Works!谢谢你比谢谢你还要感谢你!!!!!基本上renderUI为renderPlot保留了绘制图形的空间。请将答案标记为已接受。
    ```{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)
    }) 
    ```