2016-04-22 2 views
1

Je développe un document brillant R Markdown à:R Markdown Brillant Liste renderPlot des parcelles de lapply

  1. un cadre Subset de données pour inclure la colonne « date » et des colonnes de données numériques. La façon dont l'entrée de l'utilisateur brillant est mis en place, vous sélectionnez les boutons radio pour les colonnes de données à inclure, puis appuyez sur le bouton "Subset Data" pour créer d() - AUCUN PROBLÈME :)
  2. Générer une liste de parcelles (plotList), un pour chaque colonne de données numériques (en fonction de la colonne de date). J'utilise la fonction package openairtimePlot pour générer les parcelles et lapply pour générer la liste des objets de terrain (plotList) - Pas de problème :)
  3. utilisation renderPlot à la sortie de toutes les parcelles plotList au document R Markdown - PROBLÈME: (

Je sais qu'il ya eu des questions similaires (par exemple https://gist.github.com/wch/5436415/, Reactivity in R shiny with toy example et dynamically add plots to web page using shiny), et s'il vous plaît, croyez-moi j'ai essayé et essayé (par exemple, en utilisant une boucle au lieu de lapply-pas ma préférence, mais si ça a marché alors qui s'en soucie, ajoutant local() et/ou observe(), etc.) Peu importe ce que je fais, je n'arrive pas à le faire fonctionner. à R Markdown et à Shiny, je ne peux pas comprendre cela - s'il vous plaît aider!

Voici un exemple reproductible (à exécuter en tant que document R markdown brillant).

D'abord le morceau qui crée un ensemble de données réactif 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())}) 
``` 

Maintenant, le deuxième morceau, pour créer plotList et le sortir (PARTIE QUI NE FONCTIONNE PAS):

Tentative 1: seule la dernière le tracé est affiché

```{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) 

    }) 
    ``` 

Tentative 2 (basée sur Reactivity in R shiny with toy example). Pas de parcelles sont affichés

```{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 
``` 

Je tripoté sans cesse ce, en se référant à des questions similaires l'que je lien ci-dessus.

Répondre

0

[Nouvelle réponse]

J'ai finalement obtenu ce travaillé. La clé est de suivre exactement l'exemple dans le troisième lien de votre message, en utilisant d'abord 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éponse originale basée sur des panneaux en treillis]

Ce n'est pas exactement ce que vous voulez, mais j'ai toutes les parcelles affichées dans une parcelle.

```{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) 
}) 
``` 
+0

Merci d'avoir essayé. Je pourrais générer le même tracé que précédemment en utilisant 'pollutant = names (d()) [- 1]' comme argument dans timePlot et en supprimant la fonction 'tp'. La raison pour laquelle cela ne fonctionnera pas pour moi est parce que j'ai besoin de tracer de nombreuses colonnes de données par rapport à la date (> 10) et les avoir toutes en panneaux séparés dans un seul graphique ne sera pas désiré, les données seront trop compressées. J'ai besoin d'eux dans des parcelles séparées. – chaganoff

+0

Vous pouvez définir la hauteur de l'image à ajuster dynamiquement en fonction du nombre de panneaux. –

+0

Cela pourrait fonctionner! Seriez-vous capable de fournir un exemple de code pour savoir comment faire cela? En fin de compte, il serait utile pour moi de savoir comment faire des parcelles séparées car j'aurai plusieurs applications (par exemple, diviser les données par polluant, ou par site, etc.). Mais ne peut pas être trop difficile étant donné que je suis totalement coincé. – chaganoff