无法在 Shiny R dashboardBody 上单独显示我的简单条形图
Couldn't show my simple bar charts separately on Shiny R dashboardBody
所以我正在尝试制作一个非常简单的 Shiny R 仪表板,它显示将链接到可编辑 excel 文件的进度百分比。这是一个示例数据:
| Month | PERCENTAGE |
|:---------|:---------------|
| JAN | 90 |
| FEB | 78 |
| MAR | 100 |
| APR | 99 |
| MAY | 90 |
| JUN | 78 |
| JUL | 100 |
| AUG | 87 |
| SEP | 90 |
| OCT | 78 |
| NOV | 99 |
| DES | 100 |
这是我的 ui.R 代码:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)
# data1 <- read_excel ("Data1.xlsx")
shinydashboard::dashboardPage(skin = "blue",
dashboardHeader(title = "UPDL PANDAAN"),
#sidebar
dashboardSidebar(
sidebarMenu(
menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
fluidPage(
actionButton("myButton", "About Us")
)
)),
dashboardBody(
h1("PROSENTASE MATERI TAHUN 2022"),
actionButton(
inputId = "input1",
label = 'JAN'),
actionButton(
inputId = 'input2',
label = 'FEB'),
actionButton(
inputId = 'input3',
label = 'MAR'),
actionButton(
inputId = 'input4',
label = 'APR'),
actionButton(
inputId = 'input5',
label = 'MAY'),
actionButton(
inputId = 'input6',
label = 'JUN'),
actionButton(
inputId = 'input7',
label = 'JUL'),
actionButton(
inputId = 'input8',
label = 'AUG'),
actionButton(
inputId = 'input9',
label = 'SEP'),
actionButton(
inputId = 'input10',
label = 'OCT'),
actionButton(
inputId = 'input11',
label = 'NOV'),
actionButton(
inputId = 'input12',
label = 'DES'),
fluidPage(
plotOutput('inpoet')
)
)
)
这是我的 server.R 代码:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(DT)
library(readxl)
library(shinyalert)
# Data1 <- read_excel("Data1.xlsx")
shinyServer(function(input, output, session) {
function(input, output, session) {
observeEvent(input$input1, {
output$inpoet1 <- renderPlot({
plotOutput('plot1')
})
})
observeEvent(input$input2, {
output$inpoet <- renderPlot({
plotOutput('plot2')
})
})
observeEvent(input$input3, {
output$inpoet <- renderPlot({
plotOutput('plot3')
})
})
observeEvent(input$input4, {
output$inpoet <- renderPlot({
plotOutput('plot4')
})
})
observeEvent(input$input5, {
output$inpoet <- renderPlot({
plotOutput('plot5')
})
})
observeEvent(input$input6, {
output$inpoet <- renderPlot({
plotOutput('plot6')
})
})
observeEvent(input$input7, {
output$inpoet <- renderPlot({
plotOutput('plot7')
})
})
observeEvent(input$input8, {
output$inpoet <- renderPlot({
plotOutput('plot8')
})
})
observeEvent(input$input9, {
output$inpoet <- renderPlot({
plotOutput('plot9')
})
})
observeEvent(input$input10, {
output$inpoet <- renderPlot({
plotOutput('plot10')
})
})
observeEvent(input$input11, {
output$inpoet <- renderPlot({
plotOutput('plot11')
})
})
observeEvent(input$input12, {
output$inpoet <- renderPlot({
plotOutput('plot12')
})
})
output$plot1 <- renderPlot({
df <- data.frame(Month=c("JAN"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot2 <- renderPlot({
df <- data.frame(Month=c("FEB"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot3 <- renderPlot({
df <- data.frame(Month=c("MAR"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot4 <- renderPlot({
df <- data.frame(Month=c("APR"),
Percentage=c(99))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot5 <- renderPlot({
df <- data.frame(Month=c("MAY"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot6 <- renderPlot({
df <- data.frame(Month=c("JUN"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot7 <- renderPlot({
df <- data.frame(Month=c("JUL"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot8 <- renderPlot({
df <- data.frame(Month=c("AUG"),
Percentage=c(87))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot9 <- renderPlot({
df <- data.frame(Month=c("SEP"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot10 <- renderPlot({
df <- data.frame(Month=c("OCT"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot11 <- renderPlot({
df <- data.frame(Month=c("NOV"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot12 <- renderPlot({
df <- data.frame(Month=c("DES"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
}
observeEvent(input$myButton, {
shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%") }
)
我是初学者。
的确,看起来你正在尝试做相对简单的应用程序(但是我认为根据开发人员的经验来定义复杂性是可以的)。
我将向您展示如何使其更简单以及如何使其发挥作用:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)
data1 <- data.frame(
stringsAsFactors = FALSE,
Month = c("JAN","FEB",
"MAR","APR","MAY","JUN","JUL","AUG","SEP",
"OCT","NOV","DES"),
Percentage = c(90L,78L,100L,
99L,90L,78L,100L,87L,90L,78L,99L,100L)
)
ui <- shinydashboard::dashboardPage(skin = "blue",
dashboardHeader(title = "UPDL PANDAAN"),
#sidebar
dashboardSidebar(
sidebarMenu(
menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
fluidPage(
actionButton("myButton", "About Us")
)
)),
dashboardBody(
h1("PROSENTASE MATERI TAHUN 2022"),
selectInput("month", "Choose month", choices = data1$Month),
plotOutput('inpoet')
)
)
server <- function(input, output, session) {
output$inpoet <- renderPlot({
df <- data1 %>%
filter(Month == input$month)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
observeEvent(input$myButton, {
shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%")
})
}
shinyApp(ui, server)
在上面的应用程序中,我删除了 actionButton
并使用了 selectInput
,因此我们将使用列表代替按钮。而在 server
部分我只留下了一个 renderPlot
。我使用了一个文件(app.R
,所以在底部是 shinyApp(ui, server)
- 如果我们在一个文件中有应用程序,则需要这个)。
让我们仔细看看这一切:
- 你需要记住
ui
部分中的一个 plotOutput
需要通过公共 inputId
与 server
部分中的一个 renderPlot
连接。所以,因为我们有 plotOutput('inpoet')
,所以我们需要有 output$inpoet
。没有它,您将看不到屏幕上呈现的任何内容。
- Shiny 如何知道 - 如果选择了新的月份 - 它应该显示不同的情节?这是因为
renderPlot
中的这段代码:filter(Month == input$month)
。这里最重要的是 input$month
- 当你在服务器部分使用 input$
时(以及在反应上下文中,所以在 reactive
、eventReactive
、observe
、observeEvent
和任何 render*
函数),每当这个 input$
改变时,Shiny 就会根据这个新的、改变的值重新计算新对象(绘图、data.frame 或其他)。
让我们仔细看看您的代码:
- 这个带有
actionButton
s 的解决方案很糟糕,但我不确定如何解释它。也许看看我的提议 - 它比你的要简单得多。如果您更喜欢使用与您的应用更相似的东西 - 请查看 shiny
中的 radioButtons
。
- 你不应该嵌套反应式 - 这是一个不嵌套它们的好习惯,只是没有必要,可能在任何情况下都没有必要。
所以我正在尝试制作一个非常简单的 Shiny R 仪表板,它显示将链接到可编辑 excel 文件的进度百分比。这是一个示例数据:
| Month | PERCENTAGE |
|:---------|:---------------|
| JAN | 90 |
| FEB | 78 |
| MAR | 100 |
| APR | 99 |
| MAY | 90 |
| JUN | 78 |
| JUL | 100 |
| AUG | 87 |
| SEP | 90 |
| OCT | 78 |
| NOV | 99 |
| DES | 100 |
这是我的 ui.R 代码:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)
# data1 <- read_excel ("Data1.xlsx")
shinydashboard::dashboardPage(skin = "blue",
dashboardHeader(title = "UPDL PANDAAN"),
#sidebar
dashboardSidebar(
sidebarMenu(
menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
fluidPage(
actionButton("myButton", "About Us")
)
)),
dashboardBody(
h1("PROSENTASE MATERI TAHUN 2022"),
actionButton(
inputId = "input1",
label = 'JAN'),
actionButton(
inputId = 'input2',
label = 'FEB'),
actionButton(
inputId = 'input3',
label = 'MAR'),
actionButton(
inputId = 'input4',
label = 'APR'),
actionButton(
inputId = 'input5',
label = 'MAY'),
actionButton(
inputId = 'input6',
label = 'JUN'),
actionButton(
inputId = 'input7',
label = 'JUL'),
actionButton(
inputId = 'input8',
label = 'AUG'),
actionButton(
inputId = 'input9',
label = 'SEP'),
actionButton(
inputId = 'input10',
label = 'OCT'),
actionButton(
inputId = 'input11',
label = 'NOV'),
actionButton(
inputId = 'input12',
label = 'DES'),
fluidPage(
plotOutput('inpoet')
)
)
)
这是我的 server.R 代码:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(DT)
library(readxl)
library(shinyalert)
# Data1 <- read_excel("Data1.xlsx")
shinyServer(function(input, output, session) {
function(input, output, session) {
observeEvent(input$input1, {
output$inpoet1 <- renderPlot({
plotOutput('plot1')
})
})
observeEvent(input$input2, {
output$inpoet <- renderPlot({
plotOutput('plot2')
})
})
observeEvent(input$input3, {
output$inpoet <- renderPlot({
plotOutput('plot3')
})
})
observeEvent(input$input4, {
output$inpoet <- renderPlot({
plotOutput('plot4')
})
})
observeEvent(input$input5, {
output$inpoet <- renderPlot({
plotOutput('plot5')
})
})
observeEvent(input$input6, {
output$inpoet <- renderPlot({
plotOutput('plot6')
})
})
observeEvent(input$input7, {
output$inpoet <- renderPlot({
plotOutput('plot7')
})
})
observeEvent(input$input8, {
output$inpoet <- renderPlot({
plotOutput('plot8')
})
})
observeEvent(input$input9, {
output$inpoet <- renderPlot({
plotOutput('plot9')
})
})
observeEvent(input$input10, {
output$inpoet <- renderPlot({
plotOutput('plot10')
})
})
observeEvent(input$input11, {
output$inpoet <- renderPlot({
plotOutput('plot11')
})
})
observeEvent(input$input12, {
output$inpoet <- renderPlot({
plotOutput('plot12')
})
})
output$plot1 <- renderPlot({
df <- data.frame(Month=c("JAN"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot2 <- renderPlot({
df <- data.frame(Month=c("FEB"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot3 <- renderPlot({
df <- data.frame(Month=c("MAR"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot4 <- renderPlot({
df <- data.frame(Month=c("APR"),
Percentage=c(99))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot5 <- renderPlot({
df <- data.frame(Month=c("MAY"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot6 <- renderPlot({
df <- data.frame(Month=c("JUN"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot7 <- renderPlot({
df <- data.frame(Month=c("JUL"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot8 <- renderPlot({
df <- data.frame(Month=c("AUG"),
Percentage=c(87))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot9 <- renderPlot({
df <- data.frame(Month=c("SEP"),
Percentage=c(90))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot10 <- renderPlot({
df <- data.frame(Month=c("OCT"),
Percentage=c(78))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot11 <- renderPlot({
df <- data.frame(Month=c("NOV"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
output$plot12 <- renderPlot({
df <- data.frame(Month=c("DES"),
Percentage=c(100))
head(df)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
}
observeEvent(input$myButton, {
shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%") }
)
我是初学者。
的确,看起来你正在尝试做相对简单的应用程序(但是我认为根据开发人员的经验来定义复杂性是可以的)。
我将向您展示如何使其更简单以及如何使其发挥作用:
library(ggplot2)
library(shiny)
library(tidyverse)
library(shinydashboard)
library(readxl)
library(shinyalert)
data1 <- data.frame(
stringsAsFactors = FALSE,
Month = c("JAN","FEB",
"MAR","APR","MAY","JUN","JUL","AUG","SEP",
"OCT","NOV","DES"),
Percentage = c(90L,78L,100L,
99L,90L,78L,100L,87L,90L,78L,99L,100L)
)
ui <- shinydashboard::dashboardPage(skin = "blue",
dashboardHeader(title = "UPDL PANDAAN"),
#sidebar
dashboardSidebar(
sidebarMenu(
menuItem("WIG PMK 2020", tabName = "WIGPMK", icon = icon("tachometer-alt")),
fluidPage(
actionButton("myButton", "About Us")
)
)),
dashboardBody(
h1("PROSENTASE MATERI TAHUN 2022"),
selectInput("month", "Choose month", choices = data1$Month),
plotOutput('inpoet')
)
)
server <- function(input, output, session) {
output$inpoet <- renderPlot({
df <- data1 %>%
filter(Month == input$month)
p<-ggplot(data=df, aes(x=Month, y=Percentage, fill=Month)) +
geom_bar(stat="identity")+
theme_minimal()
p<-p + theme(legend.position="none")
p
p + coord_flip()
})
observeEvent(input$myButton, {
shinyalert(title = "UPDL PANDAAN", imageUrl ="https://lms.pln-pusdiklat.co.id/assets/themes/rti/frontend/img/logo-pln.png", imageWidth = "50%", imageHeight = "50%")
})
}
shinyApp(ui, server)
在上面的应用程序中,我删除了 actionButton
并使用了 selectInput
,因此我们将使用列表代替按钮。而在 server
部分我只留下了一个 renderPlot
。我使用了一个文件(app.R
,所以在底部是 shinyApp(ui, server)
- 如果我们在一个文件中有应用程序,则需要这个)。
让我们仔细看看这一切:
- 你需要记住
ui
部分中的一个plotOutput
需要通过公共inputId
与server
部分中的一个renderPlot
连接。所以,因为我们有plotOutput('inpoet')
,所以我们需要有output$inpoet
。没有它,您将看不到屏幕上呈现的任何内容。 - Shiny 如何知道 - 如果选择了新的月份 - 它应该显示不同的情节?这是因为
renderPlot
中的这段代码:filter(Month == input$month)
。这里最重要的是input$month
- 当你在服务器部分使用input$
时(以及在反应上下文中,所以在reactive
、eventReactive
、observe
、observeEvent
和任何render*
函数),每当这个input$
改变时,Shiny 就会根据这个新的、改变的值重新计算新对象(绘图、data.frame 或其他)。
让我们仔细看看您的代码:
- 这个带有
actionButton
s 的解决方案很糟糕,但我不确定如何解释它。也许看看我的提议 - 它比你的要简单得多。如果您更喜欢使用与您的应用更相似的东西 - 请查看shiny
中的radioButtons
。 - 你不应该嵌套反应式 - 这是一个不嵌套它们的好习惯,只是没有必要,可能在任何情况下都没有必要。