2017-10-10 6 views
0

Je voudrais utiliser do.call pour exécuter rendre les fonctions de la famille, comme renderPrint(). Ci-dessous le code ne fonctionne pas:Shiny: utiliser do.call pour exécuter les fonctions de la famille de rendu

rm(list=ls()) 

library(shiny) 

ui <- fluidPage(

    selectInput("select", label = h3("Select box"), 
       choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), 
       selected = 1), 
    hr(), 
    fluidRow(column(3, verbatimTextOutput("value"))) 

) 

server <- function(input, output, session) { 

    output$value <- do.call("renderPrint", list({ input$select })) 
} 

shinyApp(ui, server) 

Erreur:

Warning: Error in .getReactiveEnvironment()$currentContext: Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.) 
Stack trace (innermost first): 
    45: .getReactiveEnvironment()$currentContext 
    44: .subset2(x, "impl")$get 
    43: $.reactivevalues 
[...] 

Comment y parvenir? Je suppose que cela est en quelque sorte lié à l'environnement et l'évaluation paresseux, donc la fermeture pourrait la solution, mais ce n'est que de deviner ...

+0

Je suppose que 'observe ({output $ value <- do.call (" renderPrint ", liste ({input $ select}))}) résoudrait le problème. – Benjamin

Répondre

0

J'ai trouvé un moyen d'archiver cela basé sur this answer de SO. La partie clé utilise alist au lieu de list. De la documentation:

alist handles its arguments as if they described function arguments. So the values are not evaluated, and tagged arguments with no value are allowed whereas list simply ignores them. alist is most often used in conjunction with formals.

rm(list=ls()) 

library(shiny) 

ui <- fluidPage( 
    selectInput("select", label = h3("Select box"), 
       choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), 
       selected = 1), 
    hr(), 
    fluidRow(column(3, verbatimTextOutput("value")))  
) 

server <- function(input, output, session) {   
    output$value <- do.call(
    renderPrint, 
    alist(input$select) 
) 
} 

shinyApp(ui, server) 

Alternativement, vous pouvez probablement utiliser l'argument quoted dans renderPrint et envelopper quote autour de vos expressions, mais je n'avais pas de chance avec cette approche.

0

note: J'essayais d'ajouter à la réponse de Gregor dans un commentaire mais un peu échoué .. lire son premier!

do.call évalue ses arguments par défaut lors de la construction de l'appel.

Mais vous pouvez spécifier quote = TRUE quitter les args Unevaluated:

output$value <- do.call(renderPrint, list(quote(input$select), quoted = TRUE), quote = TRUE) 

Mais plus simple serait de simplement utiliser un arg cité à l'appel:

output$value <- do.call(renderPrint, list(quote(input$select))) 

alors l'expression cité obtient évalué au moment de l'appel, et vous n'évaluerez pas input$select en dehors d'un contexte réactif.

+0

'alist' fait un tour et c'est une modification plus simple que' quote', mais merci pour la réponse. – RSzT

+0

Très intéressant. Je jouais beaucoup avec 'quote' et je n'arrivais pas à le faire fonctionner. Voyant que c'est si simple, ça me rend un peu bête :) –