如何在Shiny应用程序中将用户输入作为R代码运行?

时间:2017-07-27 10:16:30

标签: r shiny shinyjs

我想创建一个闪亮的应用程序,它有一个输入用于编写一些R函数或Command,通过ui.R读取它然后将它传递给server.R执行该R命令以显示结果。

我花了几个小时搜索一些例子,但无法找到任何东西,我已经知道如何使用ui和服务器创建Shiny应用程序并将输入值传递给服务器并使用它们,但我不知道是否& #39;可以创建像R这样的闪亮应用程序,您可以在其中编写命令并返回结果,任何示例或帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:6)

让用户在您的应用中运行代码是不好的做法,因为它带来了很大的安全风险。但是,对于开发,您可能需要检查Dean Attali的shinyjs包中的this function

链接示例:

  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())

答案 1 :(得分:0)

我能够找到不需要shinyjs的替代解决方案-希望重申Florian的担忧,即让用户在您的Shiny应用程序中运行代码通常不是一件好事(不安全) 。这是替代方法:

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)