如何从textInput传递字符串到闪亮的R中的函数(如nls)
问题描述:
我想写一个闪亮的应用程序,它应该计算非线性拟合函数的参数。为了计算nls,需要使用参数的起始值。因此,理想的情况是,用户应该能够在一个textInput中编写公式,并在额外的textInput中设置所用参数的起始值,如a*x^2
和a=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)))
简单的替代方案将是输入一个值,而不是一个表达式,并直接使用它 - :)
谢谢! :)完美的作品。我的目的是让应用更加灵活,以便用户可以插入任意数量的参数,只要他设置一个起始值即可。 另一种方法是灵活的uiOutput,它会为每个使用的参数生成一个textInput来设置开始值。 但我认为这个解决方案更直接;) –