checkboxGroupInput在R shiny中用于ggplot

时间:2017-06-23 13:23:26

标签: r checkbox shinydashboard

我试图在一个应该绘制图形的闪亮应用程序中包含复选框。 我的问题似乎很简单,但我自己无法解决:(尽管StackOverflow或R帮助工具上有多个CheckboxGroupInput问题...

所以,我有一项科学研究,包括8篇论文(命名为1至8)和5篇控制论文(称为PC1至PC5)。 我希望我的应用程序通过复选框询问您要查看哪些文章,并在同一图形中绘制它们。 请注意我已经有一个下拉菜单,询问您希望看到哪两个变量(在2个图形中),这就像魅力一样。

以下是我的ui简化版:

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)
            )
          )
  )  
  ))

ui部分似乎没问题,因为复选框显示正确。

这是服务器部分:

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)
  })}

在那里你可以看到我试图使用输入$ Essais,徒劳无功。 我已经读过CheckboxGroupOutput返回一个字符向量,我觉得这可能是我的问题所以我试图用as.vector欺骗它,但它并没有改变结果: 根据选中的方框,我会得到一个空图形或带有图例PC1 / NA的图形,以及一个只有我不认识的值的线(?!)。

你知道我为什么不能使用TrameTest [输入$ Essais]作为我的x值吗?是因为它不是矢量吗? 你有可以用作参考的CheckboxGroupInput的simle(我对R还不是很好)的例子吗?

提前感谢您的时间和想法

2 个答案:

答案 0 :(得分:0)

我找到了有用的东西! 在服务器部分,我首先对我的数据帧(TrameTest)进行子集化,只保留名称对应于输入$ 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)
  })

答案 1 :(得分:0)

你的问题不是闪亮而是对选择的误解。

TrameTest[input$Essais,]

检查是否找到与input$Essais对应的rownames,并选择这些行。但是从您的代码和您自己的答案中可以清楚地看到,您希望第{2}行中出现input$Essais的行。这是完全不同的事情,首先是rownames必须是唯一的,而你的新代码允许多次出现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)
  })