如何在 Shiny 应用程序中 运行 用户输入 R 代码?
How to run user input as R code in a Shiny app?
我想创建一个闪亮的应用程序,它具有用于编写某些 R 函数或命令的输入,通过 ui.R 读取它,然后将其传递给执行该 R 命令以显示的 server.R结果。
我花了几个小时搜索一些示例但找不到任何东西,我已经知道如何使用 ui 和服务器创建闪亮的应用程序并将输入值传递给服务器并使用它们,但我有不知道是否可以创建像 R 这样的闪亮应用程序,您可以在其中编写命令和 return 结果,任何示例或帮助将不胜感激。
让用户 运行 在您的应用程序中编写代码是不好的做法,因为它会带来很大的安全风险。但是,对于开发,您可能需要检查 Dean Attali 的 shinyjs 包中的 this function。
示例来自 link:
library(shiny)
library(shinyjs)
shinyApp(
ui = fluidPage(
useShinyjs(), # Set up shinyjs
runcodeUI(code = "shinyjs::alert('Hello!')")
),
server = function(input, output) {
runcodeServer()
}
)
一些示例说明为什么在部署您的应用程序时包含它不是一个好主意:
尝试输入:
shinyjs::alert(ls(globalenv()))
或
shinyjs::alert(list.files())
我找到了一个不需要 shinyjs
的替代解决方案 -- 想重申 Florian 的担忧,即通常让用户 运行 不是一件好事(不安全) ] 代码在你闪亮的应用程序中。这是替代方案:
library(shiny)
library(dplyr)
ui <- fluidPage(
mainPanel(
h3("Data (mtcars): "), verbatimTextOutput("displayData"),
textInput("testcode", "Try filtering the dataset in different ways: ",
"mtcars %>% filter(cyl>6)", width="600px"),
h3("Results: "), verbatimTextOutput("codeResults"))
)
server <- function(input, output) {
shinyEnv <- environment()
output$displayData <- renderPrint({ head(mtcars) }) # prepare head(mtcars) for display on the UI
# create codeInput variable to capture what the user entered; store results to codeResults
codeInput <- reactive({ input$testcode })
output$codeResults <- renderPrint({
eval(parse(text=codeInput()), envir=shinyEnv)
})
}
shinyApp(ui, server)
我想创建一个闪亮的应用程序,它具有用于编写某些 R 函数或命令的输入,通过 ui.R 读取它,然后将其传递给执行该 R 命令以显示的 server.R结果。
我花了几个小时搜索一些示例但找不到任何东西,我已经知道如何使用 ui 和服务器创建闪亮的应用程序并将输入值传递给服务器并使用它们,但我有不知道是否可以创建像 R 这样的闪亮应用程序,您可以在其中编写命令和 return 结果,任何示例或帮助将不胜感激。
让用户 运行 在您的应用程序中编写代码是不好的做法,因为它会带来很大的安全风险。但是,对于开发,您可能需要检查 Dean Attali 的 shinyjs 包中的 this function。
示例来自 link:
library(shiny)
library(shinyjs)
shinyApp(
ui = fluidPage(
useShinyjs(), # Set up shinyjs
runcodeUI(code = "shinyjs::alert('Hello!')")
),
server = function(input, output) {
runcodeServer()
}
)
一些示例说明为什么在部署您的应用程序时包含它不是一个好主意:
尝试输入:
shinyjs::alert(ls(globalenv()))
或
shinyjs::alert(list.files())
我找到了一个不需要 shinyjs
的替代解决方案 -- 想重申 Florian 的担忧,即通常让用户 运行 不是一件好事(不安全) ] 代码在你闪亮的应用程序中。这是替代方案:
library(shiny)
library(dplyr)
ui <- fluidPage(
mainPanel(
h3("Data (mtcars): "), verbatimTextOutput("displayData"),
textInput("testcode", "Try filtering the dataset in different ways: ",
"mtcars %>% filter(cyl>6)", width="600px"),
h3("Results: "), verbatimTextOutput("codeResults"))
)
server <- function(input, output) {
shinyEnv <- environment()
output$displayData <- renderPrint({ head(mtcars) }) # prepare head(mtcars) for display on the UI
# create codeInput variable to capture what the user entered; store results to codeResults
codeInput <- reactive({ input$testcode })
output$codeResults <- renderPrint({
eval(parse(text=codeInput()), envir=shinyEnv)
})
}
shinyApp(ui, server)