R,有光泽:反应性data.frame是一个因素,设置级别和顺序

时间:2018-10-04 07:11:08

标签: r ggplot2 shiny reactive

在我闪亮的应用程序中,我有一个反应式的data.frame。然后将data.frame提供给ggplot并制作条形图。但是,我想在条形图中设置条形的确切顺序。 我可以使用

    JOIN11$ID_Polymer <- factor(JOIN11$ID_Polymer, 
                            levels=JOIN11$ID_Polymer[order(JOIN11[["Content"]])])

在我的R脚本中(一个function(),用于在闪亮的服务器之外准备数据)。

我想在闪亮的服务器中设置顺序,以便用户可以更改排序参数(用户可以通过“内容”或他选择的其他列来决定是否要对data.frame进行排序)。 我正在尝试这样的事情:

dataforplot <- reactive({
  plot_data <-  data() %>% 
    filter(Name %in% input$polymers) 
   plot_data$ID_Polymer <- factor(plot_data$ID_Polymer, 
          levels =plot_data$ID_Polymer[ order(plot_data[["Content"]])])
})

不起作用(未显示ggplot),错误提示:data must be a data frame, or other object coercible by fortify(), not a factor

ggplot的功能如下:

  plotInput <- reactive({



    ggplot(data = dataforplot(), aes(x = ID_Polymer, y = value), position = position_dodge(width = 1))  +
      geom_bar(aes_string( fill=razeni()), position = position_dodge(width = 1), stat="identity", color="white")+
      theme_minimal() +
      theme(legend.text=element_text(size=21))+
      theme(text = element_text(size=21))+
      theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
      ggtitle(input$title_text_box_id) + 
      labs(x = "", y = input$ylabel_text_box_id) + 
      geom_text(aes(x = ID_Polymer, y = value,Group=Polymer,label=value), 
                position = position_dodge(width = 1),vjust=2, size=5,colour = "white", fontface = "bold") +
      scale_fill_tableau("Tableau 10")+
     scale_x_discrete(labels=c(xpopisky()))#puts a reactive in x labels

  })

当我不尝试设置data.fram的顺序时,当我省去

时,它可以工作
plot_data$ID_Polymer <- factor(plot_data$ID_Polymer, 
          levels =plot_data$ID_Polymer[ order(plot_data[["Content"]])])

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

使用时:

dataforplot <- reactive({
  plot_data <-  data() %>% 
    filter(Name %in% input$polymers) 
   plot_data$ID_Polymer <- factor(plot_data$ID_Polymer, 
          levels =plot_data$ID_Polymer[ order(plot_data[["Content"]])])
})

reactive()中任何内容的最后一行作为该反应性元素的值返回。因此,在您的情况下,plot_data$ID_Polymer(不是数据框,而是数据框的因数列)将作为dataforplot()返回。这就是错误的原因。将您的dataforplot()定义更改为:

dataforplot <- reactive({
  plot_data <-  data() %>% 
    filter(Name %in% input$polymers) 
   plot_data$ID_Polymer <- factor(plot_data$ID_Polymer, 
          levels =plot_data$ID_Polymer[ order(plot_data[["Content"]])])
   # Add return statement for returning the dataframe
   return(plot_data)
})
相关问题