在闪亮的情况下,如何将过滤器链接到部分数据以更改某些图表而不更改其他图表?

时间:2018-12-29 11:54:04

标签: r filter shiny

我正在尝试可视化桑坦德产品推荐组合中的数据。我想用不同的过滤器显示变量的分布,以识别可能存在指示变化的变量。我是RShiny的新手。
当我事先定义过滤器并且没有将仪表板链接到这些过滤器时,我就可以使该应用程序正常工作。尝试链接时,我会收到错误消息

  

“警告:[:类型为'closure'的对象的错误不可子集”

我已经看过了,在附加代码中没有看到我在引用R认为是函数的东西。

失败的区域是我尝试定义要过滤的第二个数据集的地方。

df2<-reactive({df2<-df %>% filter(Changed %>% input$Changed)})

我已经查看了this question的错误消息,但是在R中什么都没有看到名为“ Changed”或df2的内容。

我提起this piece of code以允许选择所有内容。.但是我删除了此元素,但仍然存在此问题。

library(shiny)
#df<-trainchange
df<-data.frame(age=c(56, 63, 62, 62, 60, 49, 50, 62, 60, 57)
           ,
           Num_Changes= c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1),
           Changed=c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1))
#rng<- c("All",unique(df$Changed))
rng<- c(unique(df$Changed))

shinyUI(pageWithSidebar(
    headerPanel("Data science FTW!"),
    sidebarPanel(
            h3('Sidebar text'),
            selectInput('Changed', 'Have New Products Been Bought', 
choices=rng, selected= rng[1])
    ),
    mainPanel(
            h3('Main Panel text'),
            fluidRow(
                    splitLayout(cellWidths = c("50%", "50%"), 
plotOutput("newHist"), plotOutput("newHist3"))
            ),
            fluidRow(
                    splitLayout(cellWidths = c("50%", "50%"), 
plotOutput("newHist2"), plotOutput("newHist4"))
            )
            )
))

library(shiny)
library(tidyverse)
library(dplyr)

df<-data.frame(age=c(56, 63, 62, 62, 60, 49, 50, 62, 60, 57)
            ,
            Num_Changes= c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1),
            Changed=c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1))

# df<-trainchange

#it works when I define this and block the element of code that
#is not working, but then its just static charts
#df2<-df[df$Num_Changes!=0,]

#list will grow
var3<-c("age","Num_Changes")
shinyServer(
    function(input, output) {

#this is the part that cause the failure

            df2<-reactive({
                    df2<-df %>% filter(Changed %>% input$Changed)
                    # if(input$Changed=="All")
                    #         return()
                    # df
             })

            output$newHist <- renderPlot({
                    hist(df[,var3[1]], xlab=var1, 
col='lightblue',main='Histogram') })
            output$newHist3 <- renderPlot({
                    hist(df2[,var3[1]], xlab=var3[1], 
col='blue',main='Histogram') })
            output$newHist2 <- renderPlot({
                    hist(df[,var3[2]], xlab=var3[2], 
col='red',main='Histogram')})
            output$newHist4 <- renderPlot({
                    hist(df2[,var3[2]], xlab=var3[2], 
col='purple',main='Histogram')

              })
    }
)

我无法上载图片,但是它应该具有两个相同变量的直方图,并且彼此相邻,而右侧的直方图具有由边栏确定的不同过滤条件。一旦开始运行,我将扩展到更多过滤器和更多图表。 谢谢你提供的所有帮助。 J

1 个答案:

答案 0 :(得分:1)

首先,您需要在%in%中用%>%代替filter中的filter(Changed %>% input$Changed)。其次,reactive是一个函数,因此以后应使用reactive来调用任何()对象,以便df2成为df2()。最后,我在第一张图中将xlab从var1更改为var3[1]

这是一个有效的server函数。

 shinyServer(
    function(input, output) {

      #this is the part that cause the failure

      df2<-reactive({
        df2<-df %>% filter(Changed %in% input$Changed)
        # if(input$Changed=="All")
        #         return()
        # df
      })
      observe(print(df2()))
      output$newHist <- renderPlot({
        hist(df[,var3[1]], xlab=var3[1], 
             col='lightblue',main='Histogram') })
      output$newHist3 <- renderPlot({
        hist(df2()[,var3[1]], xlab=var3[1], 
             col='blue',main='Histogram') })
      output$newHist2 <- renderPlot({
        hist(df[,var3[2]], xlab=var3[2], 
             col='red',main='Histogram')})
      output$newHist4 <- renderPlot({
        hist(df2()[,var3[2]], xlab=var3[2], 
             col='purple',main='Histogram')

      })
    }
  )

编辑

rng<- c("All",unique(df$Changed))
df2<-reactive({
        #df2<-df %>% filter(Changed %in% input$Changed)
        if(input$Changed=="All") df else df %>% filter(Changed %in% input$Changed)
      })