2017-07-14 3 views
0

Ich möchte eine glänzende App schreiben, die die Parameter einer nichtlinearen Fit-Funktion berechnen sollte. Um ein nls zu berechnen, benötigt man Startwerte für die verwendeten Parameter. Idealerweise sollte der Benutzer in der Lage sein, eine Formel in einen textInput zu schreiben und die Startwerte für die verwendeten Parameter in einem zusätzlichen textInput wie a*x^2 und a=1 zu setzen.Wie kann ich eine Zeichenfolge von textInput an eine Funktion (wie nls) in glänzend übergeben R

Jetzt habe ich eine harte Zeit, um den Eintrag des zweiten textInput an das start Argument von nls() übergeben.

start=input$set_start nicht funktioniert, es heißt „ungültig erstes Argument“ Ich habe versucht, über noquote() die Zitate loszuwerden und as.name() und versuchte, den Wert mit get() zu bekommen, aber es sagt, dass es „Objekt‚a = 1‘nicht gefunden“ Hat jemand eine Lösung für diese Aufgabe?

Das folgende Beispiel ist nicht in diesem Setup arbeiten, aber wenn Sie den Startwert direkt und gibt a=1 statt start=input$set_start gesetzt funktioniert es

library(shiny) 


ui <- fluidPage(
    mainPanel(
     textInput("set_start","set startparameters",value = "a=1"), 
     verbatimTextOutput("nls_summary") 
    ) 
    ) 


server <- function(input, output) { 

df<-data.frame(y=c(1,3,8,17,26),x=c(1,2,3,4,5)) 
output$nls_summary<-renderPrint({ 
       nls(formula="y~a*x^2", 
        data=df, 
        start=input$set_start) 
}) 

} 

shinyApp(ui = ui, server = server) 

Antwort

0

Die einzige direkte Lösung für Ihr Problem, das ich finden konnte, ist Verwenden Sie die gefürchtete eval(parse(text="xyzzy")), die zunächst ein wenig übertrieben schien.

Darüber hinaus, um die list ordnungsgemäß zu erstellen, ist es besser eval parse den gesamten Ausdruck, wie in start = list(a=1).

st <- paste0("list(",input$set_start, ")") 
    nls(formula="y~a*x^2", 
     data=df, 
     start=eval(parse(text=st))) 

Die einfachere Alternative zur Eingabe es wäre direkt ein Wert eher als Ausdruck und verwenden - :)

+0

Thank you! :) das funktioniert perfekt. Meine Absicht war es, die App flexibler zu halten, so dass der Benutzer beliebig viele Parameter eingeben kann, solange er einen Startwert festlegt. Die Alternative wäre ein flexibles uiOutput, das für jeden verwendeten Parameter einen textInput generiert, um die Startwerte festzulegen. Aber ich denke diese Lösung ist einfacher;) –

Verwandte Themen