【问题标题】:Shiny : Automate a web app with fileInput() and selectizeInput()Shiny:使用 fileInput() 和 selectizeInput() 自动化 Web 应用程序
【发布时间】:2018-10-25 15:19:43
【问题描述】:

我正在尝试使用 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)

期望

现实

【问题讨论】:

    标签: r shiny r-corrplot


    【解决方案1】:

    这应该与您的ui() 保持不变。我改变的总结:

    1. 我更喜欢在自己的 observe() 调用中使用 update() 函数(但不确定这是否是最好的方法)
    2. 我还将列选择选项设置为子集,以便您只能选择数字列。
    3. renderPlot() 函数中,您永远不会为您选择的列设置子集。 (那是df &lt;- 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
    

    【讨论】:

    • 你好 Qwfqwf !非常感谢你!有用 !我会努力改进你的代码。
    猜你喜欢
    • 2016-12-21
    • 2014-07-12
    • 2019-07-11
    • 2012-05-19
    • 2021-04-24
    • 2021-06-08
    • 1970-01-01
    • 2019-05-20
    • 2013-06-24
    相关资源
    最近更新 更多