Запустить R скрипт после ввода в Shiny - PullRequest
0 голосов
/ 07 февраля 2019

Доброе утро всем,

У меня есть приложение Shiny, которое собирает 5 входных данных от пользователей и сохраняет их в переменных.

Тогда я смогу использовать другой скрипт R, который будет запускаться на основе информации, предоставленной пользователем.

Вот пример моего приложения Shiny:

jscode <- "shinyjs.closeWindow = function() { window.close(); }"

#Define UI for application

ui <- pageWithSidebar(
  #App title
  headerPanel("Filters applied for Powerpoints"),

   #Panel to display the filters
  sidebarPanel(
    #Select dates
    dateInput(inputId = "startDate", label = "Start date : ", value = "2018-12-01", format = "yyyy/mm/dd"),
    dateInput(inputId = "endDate", label = "End date : ", value = "2018-12-31", format = "yyyy/mm/dd"),

    #Select brand template
    selectInput("Brand", label = "Select brand : ", choices = list("Carat" = "Carat", "Amplifi" = "Amplifi", "iProspect" = "iProspect", "Isobar" = "Isobar")),

    #Select medium type
    selectInput("Medium", label = "Select medium type : ", choices = list("Social Post" = "Social Post", "Display" = "Display", "Programmatic" = "Programmatic", "SEA" = "SEA")),

    #Enter the plan ID of your campaign
    textInput("Camp", label = "Enter the plan ID of your campaign : ", value = ""),

    #Button to close the window, then run script
    useShinyjs(),
    extendShinyjs(text = jscode, functions = c("closeWindow")),
    actionButton("close", "Close and run")
  ),
  mainPanel()
)

#Define server logic
server <- function(input, output, session){
  observe({
    startDate <<- input$startDate
    endDate <<- input$endDate
    brand <<- input$Brand
    medium <<- input$Medium
    campaign <<- input$Camp
  })
  observeEvent(input$close, {
    js$closeWindow()
    stopApp()
  })
  source("C:/Users/RPeete01/Desktop/Automated powerpoints/Datorama R/Datorama reporting R/DatoramaSocial.R")
}


#Run the application 
shinyApp(ui = ui, server = server)

Я использовал функцию источника, но она не работает.

Если у кого-то есть идея, пожалуйста, дайте мне знать.

Большое спасибо,

Rémi

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вместо создания функции для замены вашего сценария, вы можете создать исходный код сценария, указав окружение для параметра local.Эта среда должна содержать объекты, необходимые для вашего сценария.Примерно так:

mylist <- reactiveVal() # we will store the inputs in a reactive list

observe({ # create the list
  mylist(list(
    startDate = input$startDate,
    endDate = input$endDate,
    brand = input$Brand,
    medium = input$Medium,
    campaign = input$Camp))
})

observeEvent(input$runScript, { # "runScript" is an action button
  source("myscript.R", local = list2env(mylist()))
})

РЕДАКТИРОВАТЬ

Вот полный пример.

library(shiny)

ui <- fluidPage(
  textInput("text", "Enter text", value = "test"),
  actionButton("runScript", "Run")
)

server <- function(input, output, session) {

  mylist <- reactiveVal() # we will store the inputs in a reactive list

  observe({ # create the list
    mylist(list(
      text = input$text))
  })

  observeEvent(input$runScript, { # "runScript" is an action button
    source("myscript.R", local = list2env(mylist()))
  })

}

shinyApp(ui, server)

Файл myscript.R:

writeLines(text, "output.txt")

Когда я запускаю приложение и нажимаю на кнопку, файл output.txt создается правильно (т. Е. Скрипт получен правильно).

0 голосов
/ 07 февраля 2019

Вы должны воспользоваться встроенными * глянцевыми функциями onStop для выполнения некоторых функций перед вызовом stopApp()

library(shiny)
if (interactive()) {
  # Open this application in multiple browsers, then close the browsers.
  shinyApp(
    ui = basicPage("onStop demo",actionButton("close", "Close and run")),

    server = function(input, output, session) {
      onStop(function() cat("Session stopped\n"))

      observeEvent(input$close, {
        stopApp()
      })
    },

    onStart = function() {
      cat("Doing application setup\n")

      onStop(function() {
        cat("Doing application cleanup, your functions go here\n")
      })
    }
  )
}
0 голосов
/ 07 февраля 2019

Ваш скрипт DatoramaSocial.R должен быть сформулирован как функция, которая принимает ваши 5 входных значений в качестве аргументов.Что касается возвращаемого значения, вы не сказали нам, что вы хотите с ним сделать.Формулируя его как функцию, я имею в виду завернуть все в DatoramaSocial.R в функцию (или несколько подфункций).Код для этой функции может легко находиться во внешнем файле сценария или вставляться перед операторами ui и server в вашем блестящем приложении.Если первое, просто включите определения, вызвав source('DatoramaSocial.R') перед вашими ui и server.

Теперь, в вашей функции server, вы можете просто вызвать еев качестве реакции на изменения во входных данных:

observe({
  DatoramaSocial(input$startDate, input$endDate, input$Brand, input$Medium, input$Camp)
})

Хотя в этом случае я рекомендую вставить actionbuttonInput и сделать так, чтобы пользователь щелкнул его, когда они выбрали все свои входы.В этом случае обновите файл до:

observeEvent(input$actionbutton, ignoreInit=TRUE, {
  DatoramaSocial(input$startDate, input$endDate, input$Brand, input$Medium, input$Camp)
})

, где actionbutton - это inputId кнопки действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...