lapply 中的 R Markdown Shiny renderPlot 图列表
R Markdown Shiny renderPlot list of plots from lapply
我正在开发一个 R Markdown Shiny 文档来:
- 子集数据框以包含 "date" 列和一些数字数据列。闪亮的用户输入的设置方式,你 select 单选按钮用于要包含的数据列,然后点击 "Subset Data" 按钮创建
d()
- 没问题:)
- 生成图表列表 (
plotList
),每个数字数据列一个(根据日期列绘制)。我正在使用 openair
包 timePlot
函数生成绘图,并使用 lapply
生成绘图对象列表 (plotList
) - 没问题:)
- 使用
renderPlot
将 plotList
中的所有绘图输出到 R Markdown 文档 - 问题:(
我知道有类似的问题(例如https://gist.github.com/wch/5436415/, Reactivity in R shiny with toy example, and dynamically add plots to web page using shiny),请相信我我已经试过了(例如使用for循环代替lapply-不是我的偏好,但是如果它有效,那么谁在乎;添加 local() and/or 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
```
我一直在无休止地摆弄这个问题,参考我在上面链接到的类似问题。
[新答案]
我终于解决了这个问题。关键是要完全按照 post 的第三个 link 中的示例,首先使用 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)
})
```
我正在开发一个 R Markdown Shiny 文档来:
- 子集数据框以包含 "date" 列和一些数字数据列。闪亮的用户输入的设置方式,你 select 单选按钮用于要包含的数据列,然后点击 "Subset Data" 按钮创建
d()
- 没问题:) - 生成图表列表 (
plotList
),每个数字数据列一个(根据日期列绘制)。我正在使用openair
包timePlot
函数生成绘图,并使用lapply
生成绘图对象列表 (plotList
) - 没问题:) - 使用
renderPlot
将plotList
中的所有绘图输出到 R Markdown 文档 - 问题:(
我知道有类似的问题(例如https://gist.github.com/wch/5436415/, Reactivity in R shiny with toy example, and dynamically add plots to web page using shiny),请相信我我已经试过了(例如使用for循环代替lapply-不是我的偏好,但是如果它有效,那么谁在乎;添加 local() and/or 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
```
我一直在无休止地摆弄这个问题,参考我在上面链接到的类似问题。
[新答案]
我终于解决了这个问题。关键是要完全按照 post 的第三个 link 中的示例,首先使用 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)
})
```