根据我在 ggplots 列表中的绘图数量创建多个 renderPlot 函数?
Create a number of renderPlot functions, based on the number of plots I have in a list of ggplots?
有什么方法可以根据我在 ggplots 列表中的绘图数量动态创建多个 renderPlot
函数?
我有一个 Shiny 应用程序,我没有使用稳定的 UI,也没有使用 renderUI,而是依靠用户提供的配置文件来告诉 Shiny 要绘制多少图节目。配置文件还提供数据,几乎可以帮助完成大部分繁重的工作。
经过多次战斗,我大部分时间都在那里。使用方便的配置文件,我可以构建正确的 UI,并生成正确数量的 ggplots。 ggplots 存在于一个列表中,创造性地命名为 list_of_ggplots
.
但是现在,我有一个 ggplots 列表,我需要像这样使用它们来绘制它们:
output$plot1 <- renderPlot({
print(list_of_ggplots[[1]])
})
但现在我遇到了存在主义危机 -- 我不能这样做,因为用户提供的配置文件告诉我我有多少地块。我不能再像通常在 Shiny 中那样对 renderPlot
调用进行硬编码,因为所需的这些函数的数量已在配置文件中定义。
鉴于我的 ggplots 列表,我需要一些方法来生成 renderPlot
调用。
有没有人做过这个或者有什么想法?非常感谢。
这是我的代码:
SERVER.R:
library(shiny)
library(ggplot2)
# 3 simple plots of different colors -- used here instead of all the complicated stuff
# where someone uses the config file that specified 3 plots, with data, etc.
ggplot_names <- c("p1", "p2", "p3")
ggplot_colors <- c("red", "blue", "green")
list_of_ggplots <- list()
j = 1
for (i in ggplot_names){
i <- ggplot(data.frame(x = c(-3, 3)))
i <- i + aes(x)
i <- i + stat_function(fun = dnorm, colour=ggplot_colors[[j]])
list_of_ggplots[[j]] <- i
j <- j+ 1
}
## here's the problem -- the user specified 3 plots.
## I can't hardcode the following shinyServer functions!!!
## What if tomorrow, the user specifies 2 plots instead?
shinyServer(function(input, output) {
output$plot1 <- renderPlot({
print(list_of_ggplots[[1]])
})
output$plot2 <- renderPlot({
print(list_of_ggplots[[2]])
})
output$plot3 <- renderPlot({
print(list_of_ggplots[[3]])
})
})
UI.R
## this top part is actually sourced from the config file
## since Shiny needs to know how many tabPages to use,
## names for the tabs, etc
number_of_tabPages <- 3
tab_names <- c("", "Tab1", "Tab2", "Tab3")
tabs<-list()
tabs[[1]]=""
for (i in 2:(number_of_tabPages+1)){
tabs[[i]]=tabPanel(tab_names[i],plotOutput(paste0("plot",i-1)))}
## Here's the familiar UI part
shinyUI(fluidRow(
column(12,
"",
do.call(navbarPage,tabs)
)
)
)
你可以使用这个解决方案(我只修改了你脚本的shinyServer
部分,所以我没有在这里列出重复的代码):
shinyServer(function(input, output) {
observe(
lapply(seq(3),function(i) output[[paste0("plot",i)]] <- renderPlot(list_of_ggplots[[i]]))
)
})
当然可以用变量代替3
有什么方法可以根据我在 ggplots 列表中的绘图数量动态创建多个 renderPlot
函数?
我有一个 Shiny 应用程序,我没有使用稳定的 UI,也没有使用 renderUI,而是依靠用户提供的配置文件来告诉 Shiny 要绘制多少图节目。配置文件还提供数据,几乎可以帮助完成大部分繁重的工作。
经过多次战斗,我大部分时间都在那里。使用方便的配置文件,我可以构建正确的 UI,并生成正确数量的 ggplots。 ggplots 存在于一个列表中,创造性地命名为 list_of_ggplots
.
但是现在,我有一个 ggplots 列表,我需要像这样使用它们来绘制它们:
output$plot1 <- renderPlot({
print(list_of_ggplots[[1]])
})
但现在我遇到了存在主义危机 -- 我不能这样做,因为用户提供的配置文件告诉我我有多少地块。我不能再像通常在 Shiny 中那样对 renderPlot
调用进行硬编码,因为所需的这些函数的数量已在配置文件中定义。
鉴于我的 ggplots 列表,我需要一些方法来生成 renderPlot
调用。
有没有人做过这个或者有什么想法?非常感谢。
这是我的代码:
SERVER.R:
library(shiny)
library(ggplot2)
# 3 simple plots of different colors -- used here instead of all the complicated stuff
# where someone uses the config file that specified 3 plots, with data, etc.
ggplot_names <- c("p1", "p2", "p3")
ggplot_colors <- c("red", "blue", "green")
list_of_ggplots <- list()
j = 1
for (i in ggplot_names){
i <- ggplot(data.frame(x = c(-3, 3)))
i <- i + aes(x)
i <- i + stat_function(fun = dnorm, colour=ggplot_colors[[j]])
list_of_ggplots[[j]] <- i
j <- j+ 1
}
## here's the problem -- the user specified 3 plots.
## I can't hardcode the following shinyServer functions!!!
## What if tomorrow, the user specifies 2 plots instead?
shinyServer(function(input, output) {
output$plot1 <- renderPlot({
print(list_of_ggplots[[1]])
})
output$plot2 <- renderPlot({
print(list_of_ggplots[[2]])
})
output$plot3 <- renderPlot({
print(list_of_ggplots[[3]])
})
})
UI.R
## this top part is actually sourced from the config file
## since Shiny needs to know how many tabPages to use,
## names for the tabs, etc
number_of_tabPages <- 3
tab_names <- c("", "Tab1", "Tab2", "Tab3")
tabs<-list()
tabs[[1]]=""
for (i in 2:(number_of_tabPages+1)){
tabs[[i]]=tabPanel(tab_names[i],plotOutput(paste0("plot",i-1)))}
## Here's the familiar UI part
shinyUI(fluidRow(
column(12,
"",
do.call(navbarPage,tabs)
)
)
)
你可以使用这个解决方案(我只修改了你脚本的shinyServer
部分,所以我没有在这里列出重复的代码):
shinyServer(function(input, output) {
observe(
lapply(seq(3),function(i) output[[paste0("plot",i)]] <- renderPlot(list_of_ggplots[[i]]))
)
})
当然可以用变量代替3