2013-04-08 16 views
26

Voglio creare un'app che utilizzi lo splendore che aggiunge dinamicamente i trame alla pagina. potrebbe essere 10 grafici e potrebbe essere solo uno. sto usando this tutorial nella brillante homepage per l'interfaccia utente dinamica.aggiungere dinamicamente i grafici alla pagina Web utilizzando lo splendente

questo è un esempio semplificato. la funzione showme è ploting il grafico

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") 
))) 

sto ottenendo il seguente errore

Listening on port 8100 
Error in .subset2(x, "impl")$defineOutput(name, value, deparse(substitute(value))) : 
    Unexpected character output for display 

se questo non è il modo - apprezzerei qualsiasi guida. Grazie.

> sessionInfo() 
R version 2.15.3 (2013-03-01) 
Platform: i386-w64-mingw32/i386 (32-bit) 

risposta

24

Forse questo esempio a causa di Winston Chang è utile:

Shiny example app with dynamic number of plots

Ecco l'esempio completo solo in caso di obsolescenza dei link:

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 
    ) 
)) 
+1

Grazie uomo - questo è quello che stavo cercando. Sono riuscito a ottenere una lista dinamica di grafici tracciati ma, voglio stampare un elenco di oggetti - ogni oggetto contiene un'intestazione, una trama e un tavolo. sai come posso farlo? – haki

+1

Intendi che a) per ogni oggetto scelto che vuoi rappresentare tutte e tre le cose (intestazione, trama e tabella) o b) per ogni oggetto scelto, vuoi quindi scegliere quale di questi tre tracciare (o fai significa qualcos'altro)? –

+0

a - per ogni oggetto voglio un'intestazione, un grafico e una tabella di riepilogo. l'interfaccia utente dinamica dovrebbe essere un contenitore di qualche tipo e non solo una trama. Ho provato ad aggiungere tabelle alla taglist e all'output usando 'renderTable' ma sta visualizzando solo l'ultima aggiunta - nel mio caso, la tabella. – haki

4

Per rispondere alla domanda nel commento di cui sopra, su come restituire dinamicamente un elenco di oggetti (per esempio, una trama, un tavolo e un testo), è possibile generare un elenco di output appropriati contenuti in un tag div nel renderUI, quindi si abbinano con le funzioni di rendering appropriate nel ciclo for. Per esempio:

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) 
     }) 
    }) 
} 
}) 

Mi auguro che aiuta!

0

aggiungere dinamicamente N trame che si desidera utilizzare lucido:

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

Problemi correlati