有没有办法在 R Shiny 应用程序中创建的对象上运行任意代码?



我的用户希望使用我的 Shiny 应用创建的对象运行一些 R 脚本。 例如,如果我的应用创建了一个新的数据框,他们希望使用新的数据框运行自己的分析。

有没有办法做到这一点? 也许 R Shiny 中的一些类似控制台(交互式)功能?

我在运行一个闪亮的应用程序时发现了这个访问/使用 R 控制台,但想知道除了构建自己的服务器之外,还有其他方法可以做到这一点。

任何意见都非常感谢。谢谢!

这是Shiny上一个非常基本的控制台示例。它基于Dean Attali的代码。这个想法是使用与 shiny 相同的环境从具有eval函数的textInput执行任意代码。为了测试这个想法,变量myDat是在服务器函数中创建的,用户可以使用。它还应该适用于以后创建的其他对象。我还启用了"Enter"键以使用 JavaScript 按 [运行] 按钮,因此您无需单击该按钮。

建议仅对受信任的用户启用此控制台,它是对任何 R 命令的完全开放访问,并且可能是一个严重的安全问题。

library(shiny)
ui <- fluidPage(
# enable the <enter> key to press the [Run] button
tags$script(HTML(
'$(document).keyup(function(event) {
if (event.keyCode == 13) {
$("#run").click();
}
});'
)),
textInput("expr", label = "Enter an R expression",
value = "myDat"),
actionButton("run", "Run", class = "btn-success"),
div( style = "margin-top: 2em;",
uiOutput('result')
)
)
server <- function(input, output, session) {
shinyEnv <- environment()
myDat <- head(iris)
r <- reactiveValues(done = 0, ok = TRUE, output = "")
observeEvent(input$run, {
shinyjs::hide("error")
r$ok <- FALSE
tryCatch(
{
r$output <- isolate(
paste(
capture.output(
eval(parse(text = input$expr), envir = shinyEnv)
),
collapse = 'n'
)
)
r$ok <- TRUE
}
,
error = function(err) {
r$output <- err$message
}
)
r$done <- r$done + 1
})
output$result <- renderUI({
if (r$done > 0 ) { 
content <- paste(paste(">", isolate(input$expr)), r$output, sep = 'n')
if (r$ok) {
pre(content)
} else {
pre( style = "color: red; font-weight: bold;", content)
}
}
})
}
shinyApp(ui = ui, server = server)

如果要在运行应用程序后使数据框在全局环境中可供用户使用,可以使用assign()。以下示例使用可作为加载项添加到 RStudio 的闪亮小部件的逻辑:

shinyApp(
ui = fluidPage(
textInput("name","Name of data set"),
numericInput("n","Number observations", value = 10),
actionButton("done","Done")
),
server = function(input, output, session){
thedata <- reactive({
data.frame(V1 = rnorm(input$n),
V2 = rep("A",input$n))
})
observeEvent(input$done,{
assign(input$name, thedata(), .GlobalEnv)
stopApp()
})
}
)

但请记住,R 线程在运行闪亮应用时会持续执行,因此只有在应用停止运行后才能访问全局环境。这就是具有闪亮界面的软件包的处理方式。

如果您希望用户能够在应用程序运行时使用该数据框,您可以使用例如 shinyAce 添加代码编辑器。一个使用 shinyAce 执行任意代码的闪亮应用程序的简短示例:

library(shinyAce)
shinyApp(
ui = fluidPage(
numericInput("n","Number observations", value = 10),
aceEditor("code","# Example Code.n str(thedata())n#Use reactive expr!"),
actionButton("eval","Evaluate code"),
verbatimTextOutput("output")
),
server = function(input, output, session){
thedata <- reactive({
data.frame(V1 = rnorm(input$n),
V2 = rep("A",input$n))
})
output$output <- renderPrint({
input$eval
return(isolate(eval(parse(text=input$code))))
}) 
}
)

但是该软件包附带了一些很好的例子,所以也看看这些。

最新更新