在闪亮的仪表板中使用 Ggplot 选择输入不起作用
Posted
技术标签:
【中文标题】在闪亮的仪表板中使用 Ggplot 选择输入不起作用【英文标题】:Selectinput using Ggplot in shiny dashboard not working 【发布时间】:2019-07-04 06:46:12 【问题描述】:您好,我正在使用 Ggplot 作为我闪亮的仪表板。选择“A”时,我想绘制 Quarter Vs Freq 和 Quarter Vs FreqbyPercent 和 Quarter Vs TRinM 和 Quarter Vs TRinM
我正在使用 Ggplot 作为函数。但是当我选择“A”时没有情节,而“B”我得到了情节。
我尝试通过对所有选项分别使用 Ggplot 来获取输出。但同样的结果。
library(shinydashboard)
library(shiny)
library(shinyWidgets)
library(ggplot2)
## test data
Quarter <- c("Fy17Q1","Fy17Q1","Fy17Q1","Fy17Q2","Fy17Q2","Fy17Q2","Fy17Q3",
"Fy17Q3","Fy17Q3","Fy17Q4","Fy17Q4","Fy17Q4","Fy18Q1","Fy18Q1",
"Fy18Q1","Fy18Q2","Fy18Q2","Fy18Q2")
RiskTierDesc <- c("Above Normal","High","Normal","Above Normal","High","Normal",
"Above Normal","High","Normal","Above Normal","High","Normal",
"Above Normal","High","Normal","Above Normal","High","Normal")
Freq <- c(502,62,1452,549,88,1582,617,80,1578,530,68,1455,536,61,1551,600,52,2038)
FreqbyPercent <- c(25,3,72,25,4,71,27,4,69,26,3,71,25,3,72,22,2,76)
QuarterInNum<- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6)
TotalNRinM <- c(33.044,0,56.459,18.089,0.234,39.774,99.451,20.608,86.166,257.532,
3.93,336.079,493.464,7.952,298.565,661.728,189.184,1172.245)
TotalNRinMPercent <- c(37,0,63,31,0,68,48,10,42,43,1,56,62,1,37,33,9,58)
File2<- data.frame(Quarter,RiskTierDesc,Freq,FreqbyPercent,QuarterInNum,TotalNRinM,
TotalNRinMPercent)
File2$RiskTierDesc = factor(File2$RiskTierDesc, levels=c("High", "Above Normal", "Normal"))
ui <- dashboardPage(
dashboardHeader(title = "Basic Dashboard"),
dashboardSidebar(
sidebarMenu( selectInput("app",
"Select App:",
choices = c("","A","B"),
selected = "A",
multiple = FALSE)),
sliderTextInput("Quarter","Select Quarter:",
choices = unique(File2$Quarter),
selected = unique(File2$Quarter)[c(2, 5)])),
dashboardBody(
fluidRow(
box(solidHeader = TRUE
,collapsible = TRUE,align="center",offset = 2,title = "RiskTier Vs Quater",status = "warning", plotOutput("k", height = "300px"),width = 6)
,
box(solidHeader = TRUE
,collapsible = TRUE,align="center",offset = 4,title = "RiskTier Vs Quater(%)",status = "warning", plotOutput("l", height = "300px"),width = 6)
)))
#==========================================SERVER=======================================================#
server <- function(input, output)
dataInput <- reactive(
qfrom <- File2$QuarterInNum[match(input$Quarter[1], File2$Quarter)]
qto <- File2$QuarterInNum[match(input$Quarter[2], File2$Quarter)]
test <- File2[File2$QuarterInNum %in% seq(from=qfrom,to=qto),]
#print(test)
test
)
X<-reactive(input$app)
Test1 <- function(df,y)
arg <- match.call()
p <- ggplot(df(),
aes(x=Quarter, y= eval(arg$y) , group= RiskTierDesc , colour= RiskTierDesc )) +
geom_line(aes(size= RiskTierDesc)) +
geom_point() + ylim(0,15000) +
scale_color_manual(values=c("red","orange","green")) +
scale_size_manual(values=c(1,1,1)) +
labs( x = "Quarter", y = input$yaxis) +
geom_text(aes(label = eval(arg$y)), position = position_dodge(0),vjust = -1) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
p
Test2 <- function(df,y)
arg <- match.call()
p <- ggplot(df(),
aes(x=Quarter, y= eval(arg$y) , group= RiskTierDesc , colour= RiskTierDesc )) +
geom_line(aes(size= RiskTierDesc)) +
geom_point() + ylim(0,100) +
scale_color_manual(values=c("red","orange","green")) +
scale_size_manual(values=c(1,1,1)) +
labs( x = "Quarter", y = input$yaxis) +
geom_text(aes(label = eval(arg$y)), position = position_dodge(0),vjust = -1) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
p
output$k<- renderPlot(
if(input$app == "A")plot(Test1(dataInput,Freq)))
output$l<- renderPlot(
if(input$app == "A")plot(Test2(dataInput,FreqbyPercent)))
output$k<- renderPlot(
if(input$app == "B")plot(Test1(dataInput,TotalNRinM)))
output$l<- renderPlot(
if(input$app == "B")plot(Test2(dataInput,TotalNRinMPercent)))
shinyApp(ui, server)
请告诉我如何获得“A”的情节。或者我错过了什么或者我的方法不正确。
【问题讨论】:
【参考方案1】:你的代码有问题:
output$k<- renderPlot(
if(input$app == "A")plot(Test1(dataInput,Freq)))
output$l<- renderPlot(
if(input$app == "A")plot(Test2(dataInput,FreqbyPercent)))
output$k<- renderPlot(
if(input$app == "B")plot(Test1(dataInput,TotalNRinM)))
output$l<- renderPlot(
if(input$app == "B")plot(Test2(dataInput,TotalNRinMPercent)))
当input$app == "A"
时,两个图都被渲染,但随后R
也会执行
output$k<- renderPlot(
if(input$app == "B")plot(Test1(dataInput,TotalNRinM)))
output$l<- renderPlot(
if(input$app == "B")plot(Test2(dataInput,TotalNRinMPercent)))
因为input$app == "B"
是FALSE
,一个空的情节将替代A
生成的情节。
这是我的建议:
output$k<- renderPlot(
if(input$app == "A")plot(Test1(dataInput,Freq))
if(input$app == "B")plot(Test1(dataInput,TotalNRinM))
)
output$l<- renderPlot(
if(input$app == "A")plot(Test2(dataInput,FreqbyPercent))
if(input$app == "B")plot(Test2(dataInput,TotalNRinMPercent))
)
当然,我会使用if else
,但这取决于你!
最好的
【讨论】:
以上是关于在闪亮的仪表板中使用 Ggplot 选择输入不起作用的主要内容,如果未能解决你的问题,请参考以下文章