我正在尝试使用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)
答案 0 :(得分:1)
这应该与您的ui()
保持不变。我所做的更改的摘要:
update()
调用中使用observe()
函数(虽然不确定这是否是最好的方法)renderPlot()
函数中,您从不为所选列设置子集。 (即df <- df[,input$corr02]
)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