闪亮:使用fileInput()和selectizeInput()

时间:2018-10-25 15:19:43

标签: r shiny r-corrplot

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

但是,我得到了:

  

错误:同时提供'X'和'Y'或类似矩阵的'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)

期望

enter image description here

真实

enter image description here

1 个答案:

答案 0 :(得分:1)

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

  1. 我更喜欢在自己的update()调用中使用observe()函数(虽然不确定这是否是最好的方法)
  2. 我还对列选择选项进行了子集设置,以便您只能选择数字列。
  3. renderPlot()函数中,您从不为所选列设置子集。 (即df <- df[,input$corr02]
  4. 我通常写这些的方式要求在开头有if语句(if (!is.null(input$corr02)),否则它将在您有机会选择哪些列之前立即引发错误。

代码:

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