2

私はR Markdown Shinyドキュメントを開発しています:

  1. 「日付」列といくつかの数値データ列を含むようにデータ フレームをサブセット化します。光沢のあるユーザー入力の設定方法では、含めるデータ列のラジオ ボタンを選択し、[サブセット データ] ボタンをクリックして作成しますd()- 問題ありません:)
  2. plotList数値データ列 (日付列に対してプロット) ごとに 1 つずつ、プロットのリスト ( ) を生成します。openairパッケージtimePlot関数を使用してプロットlapplyを生成し、プロット オブジェクトのリストを生成しています ( plotList) - 問題ありません:)
  3. renderPlotすべてのプロットを R Markdown ドキュメントに出力するために使用plotList- 問題:(

私は同様の質問があったことを知っています (例: https://gist.github.com/wch/5436415/R の反応性はおもちゃの例を使った光沢のあるもので、光沢のあるものを使用して Web ページにプロットを動的に追加します)、私が試したことを信じてくださいそして試してみました(たとえば、lapplyの代わりにforループを使用します-私の好みではありませんが、それが機能した場合、誰が気にしますか; local() および/またはobserve();などを追加します)。私が何をしても、私はそれを機能させることができません。私は R Markdown と Shiny を初めて使用します。これを理解することはできません - 助けてください!

これは再現可能な例です (R マークダウンの光沢のあるドキュメントとして実行されます)。

まず、リアクティブ データセットを作成するチャンク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())})
```

次に、2 番目のチャンクを作成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 (おもちゃの例で光沢のある R の反応性に基づく)。プロットが表示されない

```{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
```

上記でリンクした同様の質問を参照して、これを際限なくいじりました。

4

1 に答える 1

3

【新たな回答】

私はついにこれを解決しました。重要なのは、最初に renderUI を使用して、投稿の 3 番目のリンクの例に正確に従うことです!

```{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]]
        })
    })
}
})
```

[格子パネルに基づく元の回答]

これはまさにあなたが望むものではありませんが、すべてのプロットが 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
  }
  tp(i)
}) 
``` 
于 2016-04-22T20:15:13.487 に答える