checkboxGroupInput 在 R 中用于 ggplot

问题描述 投票:0回答:2

我正在尝试在一个用于绘制图形的闪亮应用程序中包含复选框。 我的问题看起来很简单,但我无法自己解决它,尽管 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 示例可以用作参考吗?

预先感谢您的时间和想法

r checkbox shinydashboard
2个回答
1
投票

我发现了一些有用的东西! 在服务器部分,我首先对数据帧 (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)
  })

0
投票

你的问题不是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)
  })
© www.soinside.com 2019 - 2024. All rights reserved.