R语言 使用Shiny模块实现基于文件上传的多UI输出

hwamh0ep  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(169)
    • 数据集查看器**

你好,我正试图创建一个闪亮的应用程序,允许用户单独查看他们上传的数据集。
未上传文件时,将显示一条消息,要求用户上传其文件......一旦上传csv文件,消息将消失,并显示用户上传的数据集。
"我所尝试的"
我试过:在app. R和upload. R中使用conditionalPanels,为每个ui条件创建一个单独的R文件。我认为我的问题是output$table(渲染主面板ui的函数)在文件上传后没有被触发。
"我的问题"
用户上传csv文件(任何可读csv文件)后,预先存在的消息不会被上传的数据集替换。

    • 上传. R**
data = list()
numDatasets = 0

uploadSideUI <- function(id) {
  ns <- NS(id)
  tagList(
    h2("Dataset Viewer"),
    fileInput(ns("file"),label = "Upload File", multiple = FALSE, accept = ".csv")
  )
}

uploadMainUI <- function(id) {
  ns <- NS(id)
  uiOutput(ns("table"))
}

uploadServer <- function(id) {
  moduleServer(id, function(input,output,session){
    
    observeEvent(eventExpr = input$file,
                 handlerExpr = {
                   df <- read.csv(file = input$file$datapath,header = FALSE)
                   data <<- c(data,list(df))
                   numDatasets <<- numDatasets + 1
                 })
    
    output$table <- renderUI({
      if(numDatasets ==0){
        h2("please upload file")
      }else{
        req(input$file)
        print(numDatasets)
        lapply(1:numDatasets,function(i) {
          dataframe = data[[i]]
          tagList(
            h2(paste("dataset",i)),
            hr(),
            datatable(dataframe,rownames = FALSE, option = list(scrollY="300px",searching=FALSE)),
            br()
          )
      })
      }
    })
  })
}
    • 应用程序R**
#app.R
library(DT)
library(shiny)
source("testModule.R")
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      uploadSideUI("uploadPage")
    ),mainPanel(
      uploadMainUI("uploadPage")
    )
  )
)

server <- function(input, output, session) {
  uploadServer("uploadPage")
}

shinyApp(ui = ui, server = server)

我是新的模块化过程在光泽,所以如果你有任何其他的建议,请指出他们!谢谢提前!

rsl1atfo

rsl1atfo1#

试试这个

uploadServer <- function(id) {
  moduleServer(id, function(input,output,session){
    rv <- reactiveValues(numDatasets = 0)
    observeEvent(eventExpr = input$file,
                 handlerExpr = {
                   df <- read.csv(file = input$file$datapath,header = FALSE)
                   data <<- c(data,list(df))
                   rv$numDatasets <<- rv$numDatasets + 1
                 })
    
    output$table <- renderUI({
      if(rv$numDatasets == 0){
        h2("please upload file")
      }else{
        req(input$file)
        print(rv$numDatasets)
        lapply(1:rv$numDatasets,function(i) {
          dataframe = data[[i]]
          tagList(
            h2(paste("dataset",i)),
            hr(),
            datatable(dataframe,rownames = FALSE, option = list(scrollY="300px",searching=FALSE)),
            br()
          )
        })
      }
    })
  })
}

相关问题