上传到Shiny并将其分配给环境以供进一步使用

问题描述 投票:0回答:1

我正在尝试创建一个Shiny仪表板,用户可以在其中上传数据集,命名它们,然后从下拉菜单中选择一个数据集。

我不完全理解用户如何上传,保存和进一步访问数据。我尝试使用assign(),但数据集未显示在ls()下。我的尝试:

library(data.table)
library(shinyWidgets)
library(shinydashboard)


if (interactive()) {

  ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        fileInput("file1", "Choose CSV File",
                  accept = c(
                    "text/csv",
                    "text/comma-separated-values,text/plain",
                    ".csv")
        ),

        actionButton('show_ls', 'show_ls'),

                         # Name data

        textInput('name_data', 'Store data as' , value = ''),

                         # Action button to upload

        actionButton('upload_data', 'Upload and save data')



        ),

      mainPanel(
        tableOutput('ls')
        #  textOutput('ls'))
      )
    )
  )



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

    # This part uploads one row from the file, so the user can selects columns and choose name of the file

    data <- reactive({
      file1 <- input$file1

      if(is.null(file1)){return()}

      data_input <- fread(file=file1$datapath, sep=",")

      updateTextInput(
        session,
        'name_data',
        value = file1$name
      )

      return(data_input)


    })



    #### ASSIGNING THE DATA

    assign_data <- eventReactive(input$upload_data, {

      assign(input$name_data, data(), envir = .GlobalEnv)

    })

    assign_the_data <- reactive(assign_data())


    output$contents <- renderTable({

      if(is.null(data())) return(NULL)

      data()

    })

    outputOptions(output, 'contents', suspendWhenHidden = FALSE)

    show_ls <- eventReactive(input$show_ls, {data.frame(a = ls(.GlobalEnv))})

    output$ls <- renderTable({

      show_ls()

    })





  }

  shinyApp(ui, server)
}
r shiny
1个回答
1
投票

使用assign()可能很困难,因为穿过名称空间的搜索路径可能很难预测。更好的解决方案是将数据集存储在反应值列表中,然后从那里访问它们。您可以根据存储在反应值列表中的数据集的名称动态呈现数据集选择器UI。

if (interactive()) {
  ui <- fluidPage(sidebarLayout(
    sidebarPanel(
      fileInput(
        "file1",
        "Choose CSV File",
        accept = c(
          "text/csv",
          "text/comma-separated-values,text/plain",
          ".csv"
        )
      ),

      # Name data

      textInput('name_data', 'Store data as' , value = ''),

      # Action button to upload

      actionButton('upload_data', 'Upload and save data')

    ),

    mainPanel(uiOutput("dataset_picker"),
              tableOutput('selected_table')
              #  textOutput('ls')))
    ))



    server <- function(input, output, session) {
      # This part uploads one row from the file, so the user can selects columns and choose name of the file
      dfs <- reactiveValues()

      observeEvent(input$upload_data, {
        req(input$file1, input$name_data)
        dfs[[input$name_data]] <- read.csv(input$file1$datapath[1])
        print(names(dfs))
      })

      output$dataset_picker <- renderUI({
        req(length(dfs) > 0)
        pickerInput(
          "dataset_picker",
          label = "Choose dataset",
          choices = names(reactiveValuesToList(dfs)),
          selected = NULL
        )
      })


      output$selected_table <- renderTable({
        req(input$dataset_picker)
        dfs[[input$dataset_picker]]

      })


    }

    shinyApp(ui, server)
}
© www.soinside.com 2019 - 2024. All rights reserved.