R 在shiny中,如何将筛选器链接到部分数据以更改某些图表而不是其他图表?

R 在shiny中,如何将筛选器链接到部分数据以更改某些图表而不是其他图表?,r,filter,shiny,R,Filter,Shiny,我试图将桑坦德产品推荐公司的数据可视化。我想用不同的过滤器显示变量的分布,以确定哪里可能有可能指示变化的变量。我是个新手。 当我事先定义了过滤器,并且没有将仪表板链接到这些过滤器时,我可以让应用程序工作。一旦我尝试链接它,我就会得到一个错误 警告:类型为“closure”的[:对象中的错误不可子集 我已经查过了,在附加代码中没有看到我引用了R认为是函数的东西 shinyServer( function(input, output) { #this is the part

我试图将桑坦德产品推荐公司的数据可视化。我想用不同的过滤器显示变量的分布,以确定哪里可能有可能指示变化的变量。我是个新手。 当我事先定义了过滤器,并且没有将仪表板链接到这些过滤器时,我可以让应用程序工作。一旦我尝试链接它,我就会得到一个错误

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

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

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

      })
    }
  )
失败的地方是我试图定义要筛选的第二个数据集

df2<-reactive({df2<-df %>% filter(Changed %>% input$Changed)})
我已经查看了错误消息,但在R中没有看到任何名为Changed或df2的消息

我提升以允许选择中的所有元素。但是我已经删除了这个元素,我仍然存在这个问题

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

首先,您需要%in%而不是%>%在过滤器内部为filterChanged%%>%input$Changed。其次,被动是一个函数,因此任何被动对象都应该稍后使用df2调用,以便将df2变为df2。最后,我在第一个绘图中将xlab从var1更改为var3[1]

这是一个正常工作的服务器函数

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

      })
    }
  )
编辑
感谢您的支持,以及对我的错误之处的解释。我现在正在努力使All元素正常工作。在我的UI中,我为更改的变量创建了一个范围rng,并将默认值更改为rng[2]所以它就运行了。我一选择全部,就会收到一条错误消息,说中断次数无效。我曾尝试在服务器函数中使用ifis.null语句,但随后我收到一个更大的错误,应用程序立即崩溃。感谢您的帮助。它帮助我解决了我的问题,为我的选择输入添加了multiple=TRUE。Th再次感谢您的帮助。@JamesOliver我很高兴能提供帮助。请参阅我的编辑,以了解在“All”情况下更有效的方法。