闪亮:使用 fileInput() 和 selectizeInput() 自动化 Web 应用程序

Shiny : Automate a web app with fileInput() and selectizeInput()

我正在尝试使用 fileInput() 和 selectizeInput() 函数自动化 Web 应用程序。事实上,我想根据所选变量绘制相关图。

但是,我得到:

Error : supply both 'X'and 'Y' or a matrix-like 'X'

我认为我的问题出在这段代码中:

data03 <- reactive({
file1 <- input$file
req(file1)
dataSet <- read_excel(file1$datapath)
col <- names(dataSet)
updateSelectizeInput(session = session, inputId = "corr02", choices = col)
})
observe({
varZ <- names(data03())
})
output$corrplot <- renderPlot({
 df <- data03()
 if(input$dataSubmit03){
   isolate({
       corr <- cor(x = df, method = "pearson", use  = "pairwise.complete.obs")
       corrplot(corr = corr, 
               type = "lower", 
               method = "circle", 
               tl.col = "black", 
               tl.srt = 45)
    })
   }
 })

这是我使用的全部代码。感谢您的帮助!

library(shiny)
library(xlsx)
library(corrplot)
library(readxl)

# File used for the example
data(iris)
write.xlsx(x = iris, file = "iris.xlsx")

ui <- fluidPage(
  navbarPage(
         tabPanel(title = "Presentation"),
         tabPanel(title = "Importing data",
                  sidebarLayout(
                    sidebarPanel(
                      fileInput(inputId = "file",
                                label = "Import a file",
                                accept = c(".xlsx", ".txt", ".csv")
                      )
                    ),
                    mainPanel(
                      width = 12,
                      verbatimTextOutput("table"))
                  )
         ),
         navbarMenu(title = "Descriptive analytics",
                    tabPanel(title = "Correlogram",
                             sidebarLayout(
                               sidebarPanel(
                                 selectizeInput(inputId = "corr02",
                                                label = "Select the variables:",
                                                choices = NULL,
                                                multiple = TRUE),
                                 br(),
                                 actionButton(inputId = "dataSubmit03", 
                                              label = "RUN")

                                 ),
                               mainPanel(
                                 plotOutput(outputId = "corrplot",
                                            height = "600px")
                               )
                               )
                               )
                    )
                    )
                    )

server <- function(input, output, session) {
df <- reactive({
inFile <- input$file
db <- read_excel(inFile$datapath)
db <- data.frame(db)
})
df1 <- reactive({
inFile <- input$file
db <- read_excel(inFile$datapath, na = "NA")
db <- data.frame(db)
})
data03 <- reactive({
file1 <- input$file
req(file1)
dataSet <- read_excel(file1$datapath)
col <- names(dataSet)
updateSelectizeInput(session = session, inputId = "corr02", choices = col)
})
observe({
varZ <- names(data03())
})
output$corrplot <- renderPlot({
 df <- data03()
 if(input$dataSubmit03){
   isolate({
       corr <- cor(x = df, method = "pearson", use  = "pairwise.complete.obs")
       corrplot(corr = corr, 
               type = "lower", 
               method = "circle", 
               tl.col = "black", 
               tl.srt = 45)
    })
   }
 })
}

shinyApp(ui = ui, server = server)

预期

现实

这应该与您的 ui() 保持不变。我更改的内容摘要:

  1. 我更喜欢在它们自己的 observe() 调用中使用 update() 函数(尽管不确定这是否是最好的方法)
  2. 我还对列 select 离子选项进行了子集化,以便您只能 select 数字列。
  3. renderPlot() 函数中,您永远不会对您 select 的列进行子集化。 (就是 df <- df[,input$corr02]
  4. 我通常写这些的方式要求if语句在开头(if (!is.null(input$corr02)),否则它会立即抛出错误,然后你才有机会select哪一列。

代码:

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

  data03 <- reactive({ if (!is.null(input$file)) {
    file1 <- input$file
    req(file1)
    dataSet <- read_excel(file1$datapath)
    return(dataSet)
  }}) # reactive

  observe({ if (!is.null(data03())) {
    col_v <- names(data03())
    whichNum_v <- which(sapply(data03(), class) == "numeric")
    col_v <- col_v[whichNum_v]
    updateSelectizeInput(session = session, inputId = "corr02", choices = col_v)
  }}) # observe

  output$corrplot <- renderPlot({ 

    ## Only run if selection has been made
    if (!is.null(input$corr02)) {

      ## Subset columns
      df <- data03()
      df <- df[,input$corr02]

      ## Make plot on click
      if(input$dataSubmit03){
        isolate({
          corr <- cor(x = df, method = "pearson", use  = "pairwise.complete.obs")
          corrplot(corr = corr, 
                   type = "lower", 
                   method = "circle", 
                   tl.col = "black", 
                   tl.srt = 45)})
      } # fi
    } # fi
  }) # renderPlot
} # server