dynamic地添加绘图到网页使用shiny
我想创build一个应用程序使用闪光dynamic地添加到页面的情节。 它可能是10个地块,它可能只有一个。 我在dynamic用户界面的shiny主页上使用本教程 。
这是一个简单的例子。 函数showme
正在绘制graphics
server.r
shinyServer(function(input, output) { # Create an environment for storing data symbol_env <- new.env() # Make a chart for a symbol, with the settings from the inputs make_chart <- function(symbol) { showme(symbol) } display <- c("1083484" , "1101732") output$MyList <- renderUi({ for (i in i:nrow(display)) renderPlot({make_chart(display[i])}) }) })
ui.r
shinyUI(pageWithSidebar( headerPanel("My Plots !"), sidebarPanel( wellPanel( p(strong("Scan1")))) ,mainPanel( uiOutput("MyList") )))
我收到以下错误
Listening on port 8100 Error in .subset2(x, "impl")$defineOutput(name, value, deparse(substitute(value))) : Unexpected character output for display
如果这不是方式 – 我将不胜感激任何指导。 谢谢。
> sessionInfo() R version 2.15.3 (2013-03-01) Platform: i386-w64-mingw32/i386 (32-bit)
也许这个例子是由于温斯顿张对于帮助:
与dynamic数量的情节shiny的示例应用程序
这里是完整的例子,以防万一linkrot:
server.R
max_plots <- 5 shinyServer(function(input, output) { # 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) }) # 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 = "")) }) }) } })
ui.R
shinyUI(pageWithSidebar( headerPanel("Dynamic number of plots"), sidebarPanel( sliderInput("n", "Number of plots", value=1, min=1, max=5) ), mainPanel( uiOutput("plots") # This is the dynamic UI for the plots ) ))
要回答上面的注释中的问题,关于如何dynamic地返回对象列表(例如,一个图表,一个表格和一个文本),您可以生成一个包含在renderUI中的div标签中的适当输出列表,然后与for循环中适当的渲染函数匹配。 例如:
max_plots <- 5 shinyServer(function(input, output) { # 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="") plottitle <- paste("plottitle", i, sep="") tablename <- paste("tablename", i, sep="") tags$div(class = "group-output", textOutput(plottitle, container = h3), plotOutput(plotname, height = 280, width = 250), tableOutput(tablename) ) }) # Convert the list to a tagList - this is necessary for the list of items # to display properly. do.call(tagList, plot_output_list) }) # 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="") plottitle <- paste("plottitle", my_i, sep="") tablename <- paste("tablename", 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 = "")) }) output[[plottitle]] <- renderText({paste("1:", my_i, ". n is ", input$n, sep = "") }) output[[tablename]] <- renderTable({table(x = 1:my_i, y = 1:my_i) }) }) } })
我希望有帮助!
使用shinydynamic添加N个图表:
runApp( list( ui = fluidPage( headerPanel('Tittle'), sidebarPanel( fileInput('file1', 'Choose File:'), textInput("target", label="Target", value="Choose target"), actionButton("addButton", "Go!"), p('The button start the code server'), p("This is UI") ), mainPanel( uiOutput("plots") )), #SERVER server = function(input, output) { dataset <- eventReactive(input$addButton, { #Obtain the file and textinput inFile <- input$file1 df <- read.csv(inFile$datapath) df$target <- input$target return(df) }) output$plots <- renderUI({ df <- dataset() n <- df$target[1] plot_output_list <- lapply(1:n, function(i) { plotname <- paste("plot", i, sep="") plotOutput(plotname, height = 580, width = 550) }) do.call(tagList, plot_output_list) }) observe({ for (i in 1:length()) { local({ plotname <- paste("plot", i, sep="") output[[plotname]] <- renderPlot({ #function_plot is the function generate plot function_plot() }) })#endlocal } }) } ) )
https://github.com/ericbellet/recomendacion-modelos/blob/master/shiny/generate_rocSHINY.R