r shiny: 如何在用户忘记上传文件后在应用程序中打印消息?

r shiny: How to print a message in the app after the user forgets to upload a file?

我正在构建一个基本的闪亮应用程序。 首先,我创建了一个数据框 'x' 并将其保存在我的工作目录中:

x <- data.frame(a = 1:4, b = 2:5)
write.csv(x, 'x.csv', row.names = F)

在我闪亮的时候我想:

  1. 上传文件'x.csv'

  2. 单击我的操作按钮 'Click Here' 并在单击后 运行 一些命令。

  3. 在 Shiny 应用程序本身中打印一条消息:"Load a file!" 如果我在忘记先上传文件后单击我的按钮 "Click here"。

我的代码有效,但我不知道如何显示我的消息。

我的代码:

library(shiny)

ui <- fluidPage(
  br(),
  # User should upload file x here:
  fileInput("file_x", label = h5("Upload file 'x'!")),
  br(),
  # Users clicks the button:
  actionButton("do_it", "Click Here"),
  br(),
  # Print last value of the button 'do_it':
  verbatimTextOutput("print_action")
)


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

  observeEvent(input$do_it, {

    # Just a check of my button's actions:
    output$print_action <- renderPrint({input$do_it})

    # Validating the input - next 5 lines are not working:
    # validate(
    #   need(
    #     try(is.null(input$file_x), "Load a file!")
    #     )
    # )

    # Reading in the file:
    fileData <- reactive({
      infile <- input$file_x
      if (is.null(infile)) {
        return(NULL)
      }
      read.csv(infile$datapath)
    })
    x <- fileData()

    # Writing out the same file - but under a different name:
    filename <- paste0("x", input$do_it, ".csv")
    write.csv(x, file = filename, row.names = FALSE)

  })
}

shinyApp(ui, server)

我认为 modalDialog 比显示文本更适合您想要实现的目标。我已经实现了以下两种解决方案,因此您可以进行比较。

请注意,我还稍微修改了 csv 的读数。从观察者内部设置反应是不好的做法。在这些情况下,最好使用 reactiveVal,并从 observer.

更新它

希望对您有所帮助!

library(shiny)

ui <- fluidPage(
  br(),
  # User should upload file x here:
  fileInput("file_x", label = h5("Upload file 'x'!")),
  br(),
  # Users clicks the button:
  actionButton("do_it", "Click Here"),
  br(),
  br(),
  # Print last value of the button 'do_it':
  verbatimTextOutput("print_action")
)

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

  observeEvent(input$do_it, {

    if(is.null(input$file_x))
    {
      # show pop-up ...
      showModal(modalDialog(
        title = "Oh no!",
        paste0("You have not uploaded a file, silly person!"),
        easyClose = TRUE,
        footer = NULL
      ))
      # ... or update the text
      my_text('Please upload a file.')
    }
    else
    {
      # Reading in the file:
      infile <- input$file_x
      if (is.null(infile)) {
        return(NULL)
      }
      x <- read.csv(infile$datapath)
      fileData(x) # set the reactiveVal called fileData to the file inputs.

      # Writing out the same file - but under a different name:
      filename <- paste0("x", input$do_it, ".csv")
      write.csv(x, file = filename, row.names = FALSE)
      my_text('Succes!')
    }
  })

  fileData <- reactiveVal()
  my_text <- reactiveVal('')
  output$print_action <- renderText({my_text()})
}

shinyApp(ui, server)