r - 从数据框中的列中选择变量以在 Shiny R 中绘制
问题描述
我正在尝试为 R 中的 Shiny 应用程序创建一个 EDA 选项卡,但已经遇到了第一个障碍。在我的应用程序中,我希望用户可以从数据中的每一列中选择尽可能多或尽可能少的变量进行分析。这是一个模拟数据框和相关库:-
library(wakefield)#for generating the Status variable
library(dplyr)
library(shiny)
library(shinydashboard)
library(funModeling)
set.seed(1)
Date<-seq(as.Date("2015-01-01"), as.Date("2015-12-31"), by = "1 day")
Date<-sample(rep(Date,each=10),replace = T)
Shop<-r_sample_factor(x = c("Shop_A", "Shop_B", "Shop_C","Shop_D", "Shop_E","Shop_F","Shop_G"), n=length(Date))
Product<-r_sample_factor(x=c("Meat","Fruit","Vegetables","Toiletries","Kitchenware","CleaningProducts"), n=length(Date))
Profit<-sample(1:150, length(Date), replace=TRUE)
Profit
data<-data.frame(Date,Shop,Product,Profit)
levels(data$Shop)
#[1] "Shop_A" "Shop_B" "Shop_C" "Shop_D" "Shop_E" "Shop_F" "Shop_G"
levels(data$Product)
#[1] "Meat" "Fruit" "Vegetables" "Toiletries" "Kitchenware" "CleaningProducts"
View(data)
这是一些闪亮的代码:-
#UI
ui<-fluidPage(
tabPanel("EDA",
sidebarLayout(
sidebarPanel(width = 4,
dateRangeInput("eda_daterange","Select date range", format="yyyy-mm-dd",
start=min(data$Date),
end=max(data$Date)),
pickerInput("eda_col", "Select variable",
choices = c("Shop",
"Product")),
varSelectInput("level_choice", "Select factors to include",
input$eda_col, multiple = T),
actionButton("run_eda", "Run analysis")),
mainPanel(
column(width = 8, box("Frequency plot", plotOutput("frequencyplot_eda"), width = "100%")),
column(width = 8, box("Profit plot", plotOutput("density_eda"), width = "100%"))
)
)
))
#SERVER
server<-function(input,output,session){
#Calls_new_reac<-reactive(Calls_new)
variables<-unique(input$eda_col)
observeEvent(input$run_eda,{
output$frequencyplot_eda<-renderPlot({
if(input$eda_col=="Shop"){
data<-data%>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(variables %in% input$level_choice)
freqplot<-freq(data = data, input =input$eda_col )
return(freqplot)
}else{
if(input$eda_col=="Product"){
data<-data%>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(variables %in% input$level_choice)
freqplot<-freq(data = data, input =input$eda_col )
return(freqplot)
}
}
})
output$density_eda<-renderPlot({
if(input$eda_col=="Shop"){
data<-data%>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(variables %in% input$level_choice)
densplot<-ggplot(data, aes(x=Profit,group=input$eda_col,colour=input$eda_col))+geom_density()+scale_x_log10()
return(densplot)
}else{
if(input$eda_col=="Product"){
data<-data%>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(variables %in% input$level_choice)
densplot<-ggplot(data, aes(x=Profit,group=input$eda_col,colour=input$eda_col))+geom_density()+scale_x_log10()
return(densplot)
}
}
})
})#end of observe event
}
shinyApp(ui, server)
第一个 pickerInput 允许用户选择要分析的列。varSelectInput 是我尝试允许用户从所选列中选择要分析的变量。但是,错误消息(由此引起):-
varSelectInput("level_choice", "Select factors to include",
input$eda_col, multiple = T)
这是:-
Error in is.data.frame(x) : object 'input' not found
如您所见,我的 Shiny 专业知识并不出色。我该如何整理它,以便我可以选择列并选择我想要分析的相关变量?
解决方案
一种方法是使用renderUI()
选择因子。尝试这个
data<-data.frame(Date,Shop,Product,Profit)
ui<-fluidPage(
tabPanel("EDA",
sidebarLayout(
sidebarPanel(width = 4,
dateRangeInput("eda_daterange","Select date range", format="yyyy-mm-dd",
start=min(data$Date),
end=max(data$Date)),
pickerInput("eda_col", "Select variable",
choices = c("Shop", "Product")),
uiOutput("varselect"),
actionButton("run_eda", "Run analysis")),
mainPanel(
# DTOutput("t1"),
column(width = 8, box("Frequency plot", plotOutput("frequencyplot_eda"), width = "100%")),
column(width = 8, box("Profit plot", plotOutput("density_eda"), width = "100%"))
)
)
))
#SERVER
server<-function(input,output,session){
output$varselect <- renderUI({
vars <- data[[as.name(input$eda_col)]]
selectInput("level_choice", "Select factors to include", unique(vars) , multiple = T)
})
output$t1 <- renderDT({
req(input$level_choice)
data %>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2]) %>%
filter(.data[[input$eda_col]] %in% input$level_choice)
})
observeEvent(input$run_eda,{
req(input$level_choice)
output$frequencyplot_eda<-renderPlot({
data1<-data%>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(.data[[input$eda_col]] %in% input$level_choice)
freqplot<-freq(data = data1, input = data1[[input$eda_col]] )
return(freqplot)
})
output$density_eda<-renderPlot({
data2 <- data %>%
filter(Date>=input$eda_daterange[1] & Date<=input$eda_daterange[2])%>%
filter(.data[[input$eda_col]] %in% input$level_choice)
densplot<-ggplot(data2, aes(x=Profit,group=.data[[input$eda_col]],colour=input$eda_col))+
geom_density()+scale_x_log10()
return(densplot)
})
})#end of observe event
}
shinyApp(ui, server)
推荐阅读
- php - 无法解析来自 Soap 服务的 Curl 响应(发布请愿书)
- python - BeautifullSoup 返回整个 DIV,但没有值
- android - 在真正的 android 设备上找不到 res/color/filename.xml 资源文件
- linux - 是否存在用于 stdin/stdout 的 Linux 应用程序,如果在读/写时出现问题,则通过环形缓冲区将最后一个数据输出到转储文件
- javascript - 在 ngFor 中使用 Angular 9 Slice Pipe
- angular - mat-list 显示多个项目
- javascript - vue反向数据绑定
- c++ - 数据竞争检测器 - OPENMP
- multithreading - Does TCB(thread control block) is created even if the process is composed of only on thread(the process itself)?
- javascript - Ngx Image Cropper 变换比例不平滑