在闪亮的应用程序中从 UI 中选择数据后,如何将值(选择)传递给 selectizeInput()?

Posted

技术标签:

【中文标题】在闪亮的应用程序中从 UI 中选择数据后,如何将值(选择)传递给 selectizeInput()?【英文标题】:How to pass values (choices) to selectizeInput() after selecting data from UI in shiny app? 【发布时间】:2016-04-04 02:29:51 【问题描述】:

我有一个闪亮的应用程序,它选择 xlsx/csv 文件并将其上传到系统,上传后,我希望将我提取的数据表的列名填充到 selectInput()selectizeInput()

以下代码表示用户上传数据文件的一个事件

ui.R

    library(markdown)
    require(XLConnect)


    shinyUI(navbarPage(img(class="img-polaroid",
       src=paste0("http://www.iconsdb.com/icons/preview/black/***-5-xl.png")),

       tabPanel("Table",
          titlePanel("Select Data"),
          sidebarLayout(
             sidebarPanel(
                selectInput("fileType", "Select File Type:",
                   c("MS Excel Worksheet (xls,xlsx)" = "xls",
                      "Text/CSV (.csv)" = "csv"
                      )
                   ),
                fileInput('file1', 'Choose file to upload',
                   accept = c(
                      'text/csv',
                      'text/comma-separated-values',
                      'text/tab-separated-values',
                      'text/plain',
                      '.csv',
                      '.tsv',
                      'application/vnd.ms-excel',
                      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                      '.xlsx',
                      '.xls'
                   )
                ),
                tags$hr(),
                checkboxInput('header', 'Header', TRUE),
                radioButtons('sep', 'Separator',
                   c(Comma=',',
                      Semicolon=';',
                      Tab='\t'),
                   ','),
                radioButtons('quote', 'Quote',
                   c(None='',
                      'Double Quote'='"',
                      'Single Quote'="'"),
                   '"'),
                tags$hr()


             ),
             mainPanel(
                dataTableOutput('table')
             )
          )

       ),
       tabPanel("Plot",
          sidebarLayout(
             sidebarPanel(
                radioButtons("plotType", "Plot type",
                   c("Scatter"="p", "Line"="l")
                )
             ),
             mainPanel(
                plotOutput("plot")
             )
          )
       ),
       navbarMenu("More",
          tabPanel("Summary",
             verbatimTextOutput("summary") 
          )
       )
    ))

server.R

shinyServer(
   function(input, output, session) 
      
      output$plot <- renderPlot(
         plot(data$Count,data$Sales, type=input$plotType)
      )

      output$summary <- renderPrint(
         summary(data)
      )

      output$table <- renderDataTable(
         inFile <- input$file1

         if (is.null(inFile))
            return(NULL)
         if(input$fileType=='csv')
            table1<-read.csv(inFile$datapath, header = input$header,
               sep = input$sep, quote = input$quote)
            return(table1)
          else if(input$fileType=='xls')
            table1 <- readWorksheetFromFile(inFile$datapath, sheet=1)
         

      )
   
)

公平地说,我现在有一个工作输入系统,可以从 Excel 源或文本/CSV 中获取数据。此后,我希望创建一个动态列表,将 colnames(output$table) 的值传递给我的 ui.R 并将其放在指定位置。

我该怎么做?


我尝试使用 Mason DeCamillis 对 How to get vector of options from server.R to ui.R for selectInput in Shiny R App 的回答中的 uiOutput(),但 R 向我抛出“找不到对象”错误。

另外,我想到我必须使用reactive() 才能将数据来回传递到 UI 和服务器。但是不知道该怎么做。

【问题讨论】:

This article 对于任何试图理解下面@NicE 的答案,或者一般开始使用 Shiny 中的反应式 UI 的人来说都是一个有用的参考。 【参考方案1】:

您可以将上传的表格存储在server.R 中的data 变量中,并使用您发布的链接中的代码来填写selectInput

在您的server.R 中,您可以这样做:

data <- reactive(
    inFile <- input$file1   
    if (is.null(inFile))
      return(NULL)
    if(input$fileType=='csv')
      table1<-read.csv(inFile$datapath, header = input$header,
                       sep = input$sep, quote = input$quote)
      return(table1)
     else if(input$fileType=='xls')
      table1 <- readWorksheetFromFile(inFile$datapath, sheet=1)
    
  )

    output$table <- renderDataTable(
     data()      
    )

    output$selector <- renderUI(
      selectInput("var", "Choose name:", as.list(colnames(data()))) 
    )

在您的ui.R 中,在您希望列表所在的位置添加uiOutput("selector")

【讨论】:

我如何在server.R 中再次使用选定的变量? print(output$selector) 正在抛出 Object output not found 错误。下面的说法是正确的方法吗? var&lt;-reactive(output$selector &lt;- renderUI( selectInput("var", "Choose name:", as.list(colnames(data()))) )) @sunitprasad1 您应该像往常一样使用input$selector 来获取所选变量的值。所以你会有类似的东西:var &lt;- reactive( x &lt;- input$selector; print(x) ).

以上是关于在闪亮的应用程序中从 UI 中选择数据后,如何将值(选择)传递给 selectizeInput()?的主要内容,如果未能解决你的问题,请参考以下文章

闪亮的UI - 如何使文本在点符号后的同一位置开始

如何将条件面板设置为闪亮的选择输入?

RStudio闪亮动态选择

如何防止最终用户在 MS Access 2010 应用程序中从前端查看后端数据?

如何在ui中使用使用反应函数作为输入的结果? -r 闪亮

如何安排闪亮的模块文件,以便它们在闪亮的服务器上运行?