R shiny passing reactive per selezionareInput choices

In un’app lucida (di RStudio), sul lato server , ho un reattivo che restituisce un elenco di variabili analizzando il contenuto di un textInput . L’elenco di variabili viene quindi utilizzato in selectInput e / o updateSelectInput .

Non posso farlo funzionare. Eventuali suggerimenti?

Ho fatto due tentativi. Il primo approccio consiste nell’utilizzare l’ outVar reattivo direttamente in selectInput . Il secondo approccio consiste nell’utilizzare l’ outVar reattivo in updateSelectInput . Né funziona.

server.R

 shinyServer( function(input, output, session) { outVar <- reactive({ vars <- all.vars(parse(text=input$inBody)) vars <- as.list(vars) return(vars) }) output$inBody <- renderUI({ textInput(inputId = "inBody", label = h4("Enter a function:"), value = "a+b+c") }) output$inVar <- renderUI({ ## works but the choices are non-reactive selectInput(inputId = "inVar", label = h4("Select variables:"), choices = list("a","b")) }) observe({ ## doesn't work choices <- outVar() updateSelectInput(session = session, inputId = "inVar", choices = choices) }) }) 

ui.R

 shinyUI( basicPage( uiOutput("inBody"), uiOutput("inVar") ) ) 

Poco fa, ho postato la stessa domanda su shiny-discuss, ma ha generato scarso interesse, quindi le sto chiedendo di nuovo, con scuse, https://groups.google.com/forum/#!topic/shiny- discutere / e0MgmMskfWo

Modifica 1

@Ramnath ha gentilmente pubblicato una soluzione che sembra funzionare, indicata da Edit 2 . Ma questa soluzione non risolve il problema perché l’ textinput è sul lato dell’interfaccia utente invece che sul lato server come nel mio problema. Se sposto il textinput della seconda modifica di Ramnath sul lato server , il problema si ripresenta, ovvero: nulla viene mostrato e RStudio si arresta in modo anomalo. Ho trovato che l’ input$text in as.character fa scomparire il problema.

Modifica 2

In un’ulteriore discussione, Ramnath mi ha mostrato che il problema sorge quando il server tenta di applicare la funzione dynamic outVar prima che i suoi argomenti siano stati restituiti da textinput . La soluzione è controllare prima se is.null(input$inBody) esiste.

Controllare l’esistenza di argomenti è un aspetto cruciale della costruzione di un’app lucida , quindi perché non ci ho pensato? Beh, l’ho fatto, ma devo aver fatto qualcosa di sbagliato! Considerando la quantità di tempo che ho dedicato al problema, è un’esperienza amara. Mostro dopo il codice come verificare l’esistenza.

Di seguito è riportato il codice di textinput con textinput spostato sul lato server . Si blocca RStudio quindi non provarlo a casa. (Ho usato la sua notazione)

 library(shiny) runApp(list( ui = bootstrapPage( uiOutput('textbox'), ## moving Ramnath's textinput to the server side uiOutput('variables') ), server = function(input, output){ outVar <- reactive({ vars <- all.vars(parse(text = input$text)) ## existence check needed here to prevent a crash vars <- as.list(vars) return(vars) }) output$textbox = renderUI({ textInput("text", "Enter Formula", "a=b+c") }) output$variables = renderUI({ selectInput('variables2', 'Variables', outVar()) }) } )) 

Il modo in cui di solito controllo l’esistenza è come questo:

 if (is.null(input$text) || is.na(input$text)){ return() } else { vars <- all.vars(parse(text = input$text)) return(vars) } 

Il codice di Ramnath è più breve:

 if (!is.null(mytext)){ mytext = input$text vars <- all.vars(parse(text = mytext)) return(vars) } 

Entrambi sembrano funzionare, ma lo farò da ora in poi: forse una parentesi non equilibrata nel mio costrutto mi aveva precedentemente impedito di far funzionare il controllo? L’assegno di Ramnath è più diretto.

Infine, vorrei sottolineare un paio di cose sui miei vari tentativi di eseguire il debug.

Nella mia ricerca di debug, ho scoperto che esiste un’opzione per “classificare” la priorità delle “uscite” sul lato server, che ho esplorato nel tentativo di risolvere il mio problema, ma non ha funzionato poiché il problema era altrove. Eppure, è interessante sapere e sembra non molto noto in questo momento:

 outputOptions(output, "textbox", priority = 1) outputOptions(output, "variables", priority = 2) 

In quella ricerca, ho anche provato a try :

 try(vars <- all.vars(parse(text = input$text))) 

Era abbastanza vicino, ma ancora non lo aggiustava.

La prima soluzione in cui mi sono imbattuto è stata:

 vars <- all.vars(parse(text = as.character(input$text))) 

Suppongo che sarebbe interessante sapere perché ha funzionato: è perché rallenta abbastanza? è perché as.character “aspetta” che il input$text in input$text non sia nullo?

Qualunque sia il caso, sono estremamente grato a Ramnath per il suo impegno, la sua pazienza e la sua guida.