Использование сканирования в реактивном операторе

Я пытаюсь написать простую программу на R, используя Shiny. Программа читает текстовые файлы, выбранные пользователем, а затем отображает их как объект .html. Я использую функцию «сканирования» для чтения текстового файла (NB в настоящее время пытается вывести только первую строку). Программа запускается, но вывод не обновляется. Почему вывод не обновляется? Спасибо.

library(shiny)

shinyApp(

  ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
          fileInput("text_file", "Choose text file",
                    multiple = FALSE,
                    accept = c(".txt")
          )
        ),
        mainPanel(htmlOutput("example"))
      )
    ), 

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

    text <- reactive({
            req(input$text_file)
            x <- scan(input$text_file, what = "string", sep = "\n")[1]
            })
    # text output
    output$example <- reactive({
        renderUI({
          HTML(x)
          })
    })
  }
)

shinyApp(ui, server)

person Nick Riches    schedule 04.11.2018    source источник


Ответы (1)


Вам нужно внести некоторые изменения:

  1. Файл, читающий файл, вы должны попросить, чтобы файл был прочитан из input$inputId$datapath, а не из input$inputId.
  2. Ваш renderUI() должен возвращать text(), а не x, поскольку text() — это визуализируемый реактивный объект.
  3. Вам не нужно добавлять reactive() к каким-либо render функциям в Shiny, поскольку они уже являются реактивными.

Измените свой сервер на следующий:

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

  text <- reactive({
    req(input$text_file)
    x <- scan(input$text_file$datapath, what = "string", sep = "\n")[1]
  })

  # text output
  output$example <- renderUI({
      HTML(text())
    })
}
person Vishesh Shrivastav    schedule 05.11.2018
comment
Спасибо. Работает отлично. И спасибо за разъяснения ключевых понятий. - person Nick Riches; 05.11.2018