我正在尝试在一个用于绘制图形的闪亮应用程序中包含复选框。 我的问题看起来很简单,但我无法自己解决它,尽管 StackOverflow 或 R 帮助工具上有多个 CheckboxGroupInput 问题...
所以,我有一项科学研究,包括8篇论文(命名为1到8)和5篇控制论文(命名为PC1到PC5)。 我希望我的应用程序能够通过复选框询问您想要查看哪些文章,并将它们绘制在同一个图形中。 请注意,我已经有一个下拉菜单,询问您希望看到哪两个变量(在 2 个图形中),这就像一个魅力。
这是我的用户界面的简化版本:
ui <- dashboardPage(
dashboardHeader(title="Test",
dropdownMenu(type = "notifications",
notificationItem(
text = "Verifier les points centraux",
icon = icon("exclamation-triangle"),
status = "warning"
)
)
),
dashboardSidebar(
sidebarMenu(
menuItem("Suivi par Variable", tabName = "SuiviVariable", icon =
icon("area-chart"))
)
),
dashboardBody(
# Suivi par Variable tab content
tabItem(tabName = "SuiviVariable",
h2("Graphique de Suivi pour Chaque Variable d'Intérêt"),
fluidRow(
box(title = "Choisir deux variables à comparer", status =
"info",br(),
selectInput("Variable1", label = "Variable 1",
choices = list_variables,
selected = list_variables[1]),
selectInput("Variable2", label = "Variable 2",
choices = list_variables,
selected = list_variables[1]),
checkboxGroupInput("Essais", "Essais à afficher :",c(1:8,"PC1", "PC2", "PC3", "PC4", "PC5")),
plotOutput("plot5", height = 600),
plotOutput("plot6", height = 600)
)
)
)
))
用户界面部分看起来不错,因为复选框显示正确。
这是服务器部分:
server<-function(input, output){
output$plot5 <- renderPlot({
a<- as.vector(input$Essais)
dataTest <- as.data.frame(TrameTest[a,])
ggplot(data=dataTest, aes(x= N_ByEssai,y=dataTest[,input$Variable1], group= Nom, colour=Nom))+
geom_line()+
xlab("Duree de l'Essai")+
ylab(input$Variable1)
})
output$plot6 <- renderPlot({
dataTest <- as.data.frame(TrameTest[input$Essais,])
ggplot(data=dataTest, aes(x= N_ByEssai,y=dataTest[,input$Variable2],group= Nom, colour=Nom))+
geom_line()+
xlab("Duree de l'Essai")+
ylab(input$Variable2)
})}
你可以看到我尝试使用 input$Essais,但没有成功。 我读到 CheckboxGroupOutput 返回一个字符向量,我觉得这可能是我的问题,所以我尝试用 as.vector 来欺骗它,但它不会改变结果: 根据选中的框,我会得到一个空图形或带有图例 PC1/NA 的图形,并且只有一行位于我无法识别的值处(?!)。
你知道为什么我不能只使用 TrameTest[input$Essais,] 作为我的 x 值吗?是因为它不是向量吗? 你有简单的(我对 R 还不太擅长)CheckboxGroupInput 示例可以用作参考吗?
预先感谢您的时间和想法
我发现了一些有用的东西! 在服务器部分,我首先对数据帧 (TrameTest) 进行子集化,仅保留名称与 input$Essais 相对应的行。 然后,使用我的子集数据框(dataTest),绘图就很容易了。
output$plot5 <- renderPlot({
dataTest<-subset(TrameTest, TrameTest[,2] %in% input$Essais)
ggplot(data=dataTest, aes(x= N_ByEssai,y=dataTest[,input$Variable1], group = Nom, colour=Nom))+
geom_line()+
xlab("Duree de l'Essai")+
ylab(input$Variable1)
})
你的问题不是Shiny,而是对选择的误解。
TrameTest[input$Essais,]
检查是否找到与
input$Essais
对应的行名称,并选择这些行。但从您的代码和您自己的答案来看,很明显您希望 input$Essais
出现在第二列中的那些行。这是完全不同的事情,首先行名必须是唯一的,而您的新代码允许多次出现 input$Essais
。
也就是说,在
subset()
:中建议不要在函数内部使用
?subset
这是一个旨在交互使用的便利功能。为了 编程时最好使用标准子集函数,例如 [,特别是参数子集的非标准评估 可能会产生意想不到的后果。
因此,要获得最佳代码,请执行以下操作:
output$plot5 <- renderPlot({
id <- TrameTest[, 2] %in% input$Essais
dataTest <- TrameTest[ id , ]
ggplot(data=dataTest, aes(x= N_ByEssai,y=dataTest[,input$Variable1], group = Nom, colour=Nom))+
geom_line()+
xlab("Duree de l'Essai")+
ylab(input$Variable1)
})