如何从textInput传递字符串到闪亮的R中的函数(如nls)

问题描述:

我想写一个闪亮的应用程序,它应该计算非线性拟合函数的参数。为了计算nls,需要使用参数的起始值。因此,理想的情况是,用户应该能够在一个textInput中编写公式,并在额外的textInput中设置所用参数的起始值,如a*x^2a=1如何从textInput传递字符串到闪亮的R中的函数(如nls)

现在我很难通过第二个textInput的输入start参数nls()

start=input$set_start不起作用,提示“无效的第一个参数”我就先通过noquote()as.name()摆脱了报价,并试图获得与get()值但它说:“对象‘A = 1’找不到”有任何人为此任务提供解决方案?

下面的例子并不在此设置工作,但如果你在a=1直接设置起始值和类型,而不是start=input$set_start它的工作原理

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) 

唯一直接解决您的问题,我能找到的是使用可怕的eval(parse(text="xyzzy")),这最初似乎有点矫枉过正。

此外,要正确构建list,最好是eval解析整个表达式,如start = list(a=1)

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

简单的替代方案将是输入一个值,而不是一个表达式,并直接使用它 - :)

+0

谢谢! :)完美的作品。我的目的是让应用更加灵活,以便用户可以插入任意数量的参数,只要他设置一个起始值即可。 另一种方法是灵活的uiOutput,它会为每个使用的参数生成一个textInput来设置开始值。 但我认为这个解决方案更直接;) –