【问题标题】:R Shiny Dashboard: Upload data from both local file and the online database (such as Google Sheet)R Shiny Dashboard:从本地文件和在线数据库(如 Google Sheet)上传数据
【发布时间】:2020-08-29 21:07:03
【问题描述】:

我是 Shiny 仪表板的初学者,遇到一个困扰我很久的问题。
我的最终目标是将数据分配给名为“myData”的变量,但我为用户提供了从本地文件或在线文件(在我的情况下为 GoogleSheet)上传数据的选项。
下面是我的应用程序的简化版本。为了实现目标,我做了:

  1. 在“数据”选项卡下,我创建了一个选择框“input_option”,以便用户可以选择上传本地数据 (="local") 或来自在线持久数据库 (="online) 的数据;李>
  2. 我使用“eventReactive”根据“input_option”的值获取数据;
  3. 如果用户选择从在线数据库上传数据,则数据将显示在仪表板正文中;
  4. 如果用户选择从本地文件上传数据,在dashboard body中,会显示“fileInput”框,引导用户选择本地文件。然后数据也将显示在仪表板正文的下方。

但是,问题是:

  1. 无论哪种方式,数据都无法显示在仪表板正文中。我什至不知道数据是否已成功获取;
  2. 当我选择上传在线数据然后关闭应用程序时,R 控制台不会暂停而是继续运行。

有朋友或专家可以帮我解决这些问题吗?非常感谢您的帮助!

library(shiny)
library(shinydashboard)
library(googlesheets4)
library(googledrive)

server = function(session, input, output)
{
  # "input_option" is used to select whether input data from local or online
  input_option = reactive(
    input$select_upload
  )
  
  # Upload the data
  myData = eventReactive(
    input$select_upload,
    if(input$select_upload == "local")
    {
      req(input$file_myData)
      read.csv(
        input$file_myData$datapath, 
        header = T, 
        stringsAsFactors = F, 
        sep = input$sep_file_myData)
    }
    else if(input_option() == "online")
    {
      as.data.frame(gs4_find("myData_sample") %>% range_read())
    }
  )
  
  # display the myData data uplaoded ---
  output$display_myData = eventReactive(
    myData(),
    DT::renderDataTable(
      myData(), options = list(scrollX = T)
    )
  )
}

ui = dashboardPage(
  dashboardHeader(title = "My dashboard"),
  dashboardSidebar(
    sidebarMenu(
      id = "sidebarmenu",
      menuItem("Data upload", tabName = "data", icon = icon("database")),
      conditionalPanel(
        "input.sidebarmenu === 'data'",
        selectInput(
          inputId = "select_upload", 
          label = "please select an option", 
          choices = c("local", "online"),
          selected = "local"
        )
      )
    )
  ),
  
  dashboardBody(
    tabItems(
      tabItem(
        tabName = "data",
        conditionalPanel(
          condition = "input.select_upload === 'local'",
          fileInput(inputId = "file_myData", 
                    label = "Choose csv file", 
                    accept = c("text/csv", "text/comma-separated-values", "text/plain", ".csv")),
          radioButtons(inputId = "sep_file_myData", "Separator", 
                       choices = c(Comma = ",", Semicolon = ";", Tab = "\t"), 
                       selected = ",")
        ),
        fluidRow(
          box(
            title = "myData information uploaded", solidHeader = T, status = "primary",
            width = 12,
            DT::dataTableOutput(outputId = "display_myData")
          )
        )
      )
    )
  )
)

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny user-input shinydashboard googlesheets4


    【解决方案1】:

    服务器中的两项更改将使本地文件正常工作,并且可能还会使 googledrive 工作。

    server = function(session, input, output)
    {
      # "input_option" is used to select whether input data from local or online
      input_option = reactive(
        input$select_upload
      )
      
      # Upload the data
      myData = eventReactive(
        input$file_myData, # HERE!
        if(input$select_upload == "local")
        {
          req(input$file_myData)
          read.csv(
            input$file_myData$datapath, 
            header = T, 
            stringsAsFactors = F, 
            sep = input$sep_file_myData)
        }
        else if(input_option() == "online")
        {
          as.data.frame(gs4_find("myData_sample") %>% range_read())
        }
      )
      
      # display the myData data uplaoded --- # AND HERE!
      output$display_myData = DT::renderDataTable(
        myData(), 
        options = list(scrollX = T)
      )
    }
    

    在你的帖子末尾有两个问题:

    1. 您可以使用在代码中粘贴print() 语句的老式方法来调试闪亮的应用程序。当您在应用程序中执行操作时,观看 R 控制台以查看您的代码中到达/未到达的位置。您还可以使用str() 将仅在应用运行时才存在的对象结构打印到屏幕上,以便您了解如何处理它们。
    2. 这是正常行为 - 即使浏览器选项卡关闭,您的应用程序仍在运行。请注意,您可以关闭选项卡并重新打开一个新选项卡(如果您从地址栏中复制了链接)。您还可以同时打开多个标签!要关闭应用,只需在 RStudio 中点击几次 escape。

    【讨论】:

    • 非常感谢您的建议!虽然它没有直接解决问题,但使用 str() 和 print() 的技巧确实很有帮助。我能够解决这个问题。我稍后会发布答案。
    猜你喜欢
    • 2021-10-26
    • 2019-05-21
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多