Shiny - Создать реактивную функцию из пользовательского ввода строки
Я пишу блестящее приложение, и я хочу создавать математические функции из пользовательского ввода - есть textInput, где пользователь пишет функцию, например, x^2, sin(x)+5 и т. Д. Затем я хочу построить эту функцию так, чтобы у меня было объединить строку из textInput и оператора 'function(x)', чтобы получить функцию R. Насколько я знаю, мне нужно иметь реактивную переменную, которая содержит функцию R. Я придумал это:
func<-reactive(
bquote(function(x){ .(parse(text = input$fun)[[1]])}), quoted = TRUE
)
где input$fun - это идентификатор textInput. Это решение не работает, и у меня нет другой идеи.
1 ответ
Ты можешь использовать f<-function(x) {eval(parse(text=input$func))}
превратить input
в функцию.
Фрон @JoeCheng:
Хотя это, безусловно, работает, я бы предостерег всех, кто читает это, чтобы использовать только eval()
на ввод пользователя, если приложение будет работать только локально. Приложения, которые делают это, небезопасны для развертывания на сервере, потому что пользователь может вводить любой код, который он хочет, например, system("rm -rf ~")
Например, в блестящем приложении:
app.R
library(shiny)
ui <- shinyUI(fluidPage(
mainPanel(textInput("func", "Function:", ""),
submitButton("Plot!"),
plotOutput("plot")
)
))
server <- function(input, output, session) {
output$plot<-renderPlot({
f<-function(x) {eval(parse(text=input$func))}
x<-1:10
plot(x,f(x))
}
)
}
shinyApp(ui = ui, server = server)
Дал бы вам это: