在反应式语句中使用扫描

Using scan in reactive statement

我正在尝试使用 Shiny 在 R 中编写一个简单的程序。该程序读取用户选择的文本文件,然后将其显示为 .html 对象。我正在使用 'scan' 函数读取文本文件(注意,目前只尝试输出第一行)。程序运行,但输出没有更新。为什么不更新输出?谢谢

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)

您需要进行一些更改:

  1. 文件读取一个文件,你必须要求从input$inputId$datapath而不是input$inputId读取文件。
  2. 您的 renderUI() 应该 return text() 而不是 x,因为 text() 是您正在渲染的反应对象。
  3. 您不需要将 reactive() 添加到 shiny 中的任何 render 函数,因为它们已经是反应式的。

将您的服务器更改为以下内容:

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