R闪亮循环以显示多个绘图 [英] R Shiny loop to display multiple plots
问题描述
https://gist.github.com/wch/5436415/
以便使用来自UI的输入动态设置max_plots。来自UI的输入也是动态的。
这是我的UI.R:
shinyUI(pageWithSidebar(
headerPanel("Dynamic number of plots"),
sidebarPanel(
selectInput("Desk", "Desk:" , c("A","B")),
uiOutput("choose_Product"),
uiOutput("choose_File1"),
uiOutput("choose_Term1"),
sliderInput("n", "Number of plots", value=1, min=1, max=5)
),
mainPanel(
# This is the dynamic UI for the plots
h3("Heading 1"),
uiOutput("plots"),
h3("Heading 2")
)
))
这是我的服务器。R:
shinyServer(function(input, output) {
output$choose_Product <- renderUI({
selectInput("Product", "Product:", as.list( c("Product1","Product2","Product3")))
})
output$choose_File1 <- renderUI({
selectInput("File1", "File1:", as.list(c("File1","File2","File3")))
})
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
plot_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 280, width = 250)
})
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
})##End outputplots
PrintPlots<- reactive({
## I need max_plots to be set as the length of the Vector returns from getAugmentedTerms()
max_plots<-length(getAugmentedTerms(input$Desk, input$Product, input$File1))
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n is ", input$n, sep = "") )
})
})
}##### End FoR Loop
})# END OF PRINT PLOTS
})# END OF ENERYTHING
这是我的全局。R:
getAugmentedTerms<-function(desk, product, file)
{
# this function takes 3 inputs from the UI and returns a vector
# for simplicity I am just returning a 2 element vector
d<-c(1,2)
return d
}
以下是运行它的代码:
library(shiny)
runApp("C:/Users/user/Desktop/R Projects/TestDynamicPlot")
运行此命令时,您可以看到创建的空间类似于正在绘制输出,但输出为空。有什么主意吗?谢谢!
推荐答案
因此max_plots
是硬编码的。启动应用程序时,循环for (i in 1:max_plots ) {
(仅运行一次)会创建5个新的output
元素(output$plot1 output$plot2 ...) which render a plot, but the plots are displayed only when the respective
plotOutputsexists in the UI. The
plotOutputs are created dynamically in the function
lapply(1:input$n,函数(I){input$n is the value of the slider.
5 plots are created but we only create
输入$nplot outputs. That's why this is dynamic even if
max_plots`是硬编码的。
如果需要,可以将max_plots
替换为动态参数,但需要将循环包含到AND观察器中。并且它将在每次input$n
更改时运行。
例如:
observe({
for (i in 1:input$n) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n is ", input$n, sep = "")
)
})
})
}
})
我不知道您的函数返回什么,但我想如果您将其包含在服务器函数和可以读取input
对象的反应函数中,它也可以工作。
observe({
max_plots<-length(getTerm1UI(input$Desk, input$Product, input$File1))
for(i in 1:max_plots) {
...
这篇关于R闪亮循环以显示多个绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!