Как запустить пользовательский ввод как R-код в приложении Shiny?

Я хочу создать блестящее приложение, которое имеет вход для записи некоторой функции R или команды, читает его через ui.R, а затем передает его на server.R, который выполняет эту команду R для отображения результатов.

Я часами искал какой-то пример, но ничего не нашел, я уже знаю, как создавать блестящие приложения с использованием пользовательского интерфейса и сервера, передавать входные значения на сервер и работать с ними, но я понятия не имею, можно ли создать блестящие приложения. приложение, такое как R, где вы можете писать команды и возвращать результаты, любой пример или помощь будут оценены.


person Programmer Man    schedule 27.07.2017    source источник


Ответы (2)


Позволить пользователям запускать код в вашем приложении - плохая практика, поскольку это сопряжено с серьезными рисками для безопасности. Однако для разработки вы можете проверить эту функцию из пакета shinyjs Дин Аттали.

Пример по ссылке:

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

or

shinyjs::alert(list.files())
person Florian    schedule 27.07.2017
comment
Спасибо, Флориан, это очень полезно, но только для кода javascript? могу я использовать его для кода R? - person Programmer Man; 27.07.2017
comment
Работает только для кода R. Попробуйте ввести print("This is definitely not JS code!") и проверьте свою консоль. alert - это функция R из пакета shinyjs. Надеюсь это поможет! - person Florian; 27.07.2017

Мне удалось найти альтернативное решение, которое не требует shinyjs - хотел еще раз выразить озабоченность Флориана, что в целом не очень хорошо (небезопасно) разрешать пользователям запускать код в вашем приложении 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)
person mysteRious    schedule 28.06.2020