работа с входным набором данных в R Shiny

#r #shiny

#r #блестящий

Вопрос:

Я новичок в R-Shiny, и мой вопрос может быть очень простым. После нескольких часов размышлений и поиска я не смог решить проблему. Вот в чем проблема:

1) Мое приложение просит пользователя загрузить свой набор данных.

2) Затем в файле сервера я прочитал набор данных, провел некоторые анализы и передаю результаты в пользовательский интерфейс.

3) Мой пользовательский интерфейс имеет 4 разных вывода.

4) Я считываю набор данных в функции «render» для каждого вывода. ПРОБЛЕМА: при этом данные определяются локально в области видимости каждой функции, что означает, что мне нужно перечитывать их для каждого вывода.

5) Это очень неэффективно, есть ли какая-либо альтернатива? использование reactive ?

6) Ниже приведен пример кода, показывающий, как я написал свой сервер.R:

 shinyServer(function(input, output) {

   # Interactive UI's:
   # %Completion

   output$myPlot1 <- renderPlot({
     inFile <- input$file

      if (is.null(inFile)) return(NULL)
      data <- read.csv(inFile$datapath, header = TRUE)

      # I use the data and generate a plot here

   })

   output$myPlot2 <- renderPlot({
     inFile <- input$file

      if (is.null(inFile)) return(NULL)
      data <- read.csv(inFile$datapath, header = TRUE)

      # I use the data and generate a plot here

   })

 })
  

Как я могу просто получить входные данные один раз и просто использовать их в своих выходных функциях?

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

Ответ №1:

Вы можете вызвать данные из файла в reactive функции. Затем к нему можно получить доступ, например, как myData() в других reactive функциях:

 library(shiny)
write.csv(data.frame(a = 1:10, b = letters[1:10]), 'test.csv')
runApp(list(ui = fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv',
                         'text/comma-separated-values,text/plain',
                         '.csv'))
    ),
    mainPanel(
      tableOutput('contents')
    )
  )
)
, server = function(input, output, session){
  myData <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)
    data <- read.csv(inFile$datapath, header = TRUE)
    data
  })
  output$contents <- renderTable({
    myData()
  })

}
)
)
  

введите описание изображения здесь

Комментарии:

1. Привет @jdharrison, большое спасибо за ваш ответ. Я действительно пробовал это, но получаю сообщение об ошибке, что «объект типа ‘closure’ не поддается подстановке» .

2. Пожалуйста, обратите внимание, что позже я в своих функциях визуализации буду ссылаться на «myData» и буду использовать некоторые столбцы данных через оператор $. Я получаю указанную выше ошибку каждый раз, когда использую столбец типа myData $ col1.

3. Для меня работает нормально. Доступ к столбцу будет осуществляться так, myData()$col1 однако обычно вы сначала делаете что-то вроде mydata <- myData() first в своей реактивной функции.