Доступ к данным в разных частях сервера () в блестящем - PullRequest
1 голос
/ 08 января 2020

У меня проблема с доступом к данным в разных частях моей функции server (). Структура basi c выглядит примерно так:

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

  # get the data from a file obtained from a textInput in the ui
  data <- reactive({
    req(input$file)
    file <- input$file$datapath
    # process the file and return a new dataframe

  })

  output$head <- renderTable({
    mydf <- data()
    head(mydf)
  })

  output$tail <- renderTable({
    mydf <- data()
    tail(mydf)
  })

})

Я бы не хотел дважды вызывать data (), но я не нашел способа сделать это.


Редактировать после комментария @ KentJohnson

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

Я хотел избежать необходимости дважды вызывать data(), но я не нашел способа сделать это. Я предполагал, что каждый вызов будет означать чтение из файла каждый раз. Файл очень большой, так что это моя мотивация.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Как указывает @KentJohnson, reactive уже достигает вашей цели. Выражение, которое составляет данные ...

req(input$file)
file <- input$file$datapath
# process the file and return a new dataframe

... выполняется только при изменении input$file$datapath. Он не запускается каждый раз при вызове data().

1 голос
/ 09 января 2020

Помещение ваших двух таблиц в среду observe позволяет вызывать data() только дважды, но я не знаю, подойдет ли это тому, что вы хотите сделать. Обратите внимание, что здесь я не поместил textInput или подобные вещи, потому что моя цель состояла в том, чтобы показать окружение observe. Я позволю вам адаптировать его к вашей ситуации (поскольку вы не включили в свой пост часть ui):

library(shiny)

ui <- basicPage(
  fileInput("file", 
            "Import a CSV file", 
            accept = ".csv"),
  tableOutput("head"),
  tableOutput("tail")
)

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

  # get the data from a file obtained from a textInput in the ui
  data <- reactive({
    req(input$file)
    inFile <- input$file
    read.csv(inFile$datapath, header = F, sep = ";")
    # process the file and return a new dataframe

  })

  observe({
    mydf <- data()
    if (is.null(mydf)){
      output$head <- renderTable({})
      output$tail <- renderTable({})
    }
    else {
      output$head <- renderTable({
        head(mydf)
      })
      output$tail <- renderTable({
        tail(mydf)
      })
    }
  })

})

shinyApp(ui, server)

Редактировать: Я неправильно понял вопрос ОП, см. ответ @SmokeyShakers для более подходящего ответа.

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