闪亮:使用 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()
保持不变。我更改的内容摘要:
- 我更喜欢在它们自己的
observe()
调用中使用 update()
函数(尽管不确定这是否是最好的方法)
- 我还对列 select 离子选项进行了子集化,以便您只能 select 数字列。
- 在
renderPlot()
函数中,您永远不会对您 select 的列进行子集化。 (就是 df <- df[,input$corr02]
)
- 我通常写这些的方式要求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
我正在尝试使用 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()
保持不变。我更改的内容摘要:
- 我更喜欢在它们自己的
observe()
调用中使用update()
函数(尽管不确定这是否是最好的方法) - 我还对列 select 离子选项进行了子集化,以便您只能 select 数字列。
- 在
renderPlot()
函数中,您永远不会对您 select 的列进行子集化。 (就是df <- df[,input$corr02]
) - 我通常写这些的方式要求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