闪亮的反应性意外行为

时间:2014-12-15 05:41:06

标签: r shiny

我尝试创建一个反应函数,该函数从下面代码中称为df的数据帧中查找与用户输入相对应的索引。只是为了给你一个想法,这里是数据框df的样子:

'data.frame':   87 obs. of  6 variables:
 $ Job     : Factor w/ 66 levels "Applications Engineer",..: 61 14 23 31 22 15 57 26 30 13 ...
 $ Company : Factor w/ 102 levels "A10 Networks",..: 95 50 83 71 80 60 20 7 30 51 ...
 $ Location: Factor w/ 64 levels "Ayr","Bangalore",..: 36 22 19 29 59 7 7 55 53 63 ...
 $ Posted  : num  2 3 2 3 1 1 2 5 4 1 ...
 $ Source  : Factor w/ 2 levels "Glassdoor","Indeed": 2 2 2 2 2 2 2 2 2 2 ...
 $ url     : chr  "http://ca.indeed.com/rc/clk?jk=71f1abcd100850c6" "http://ca.indeed.com/rc/clk?jk=504724a4d74674fe" "http://ca.indeed.com/rc/clk?jk=d2e78fb67e8c86d6" "http://ca.indeed.com/rc/clk?jk=df790aa5fc7bdc3c" ...

反应函数主要使用grep函数进行文本搜索并查找相应的索引。这是来自server.R的代码的相关块:

#Create a reactive function to look up the indices correponding to the inputs
    index <- reactive({
        ind.j <- if(input$j=='') NULL else grep(input$j,df[,'Job'],ignore.case = T)
        ind.c <- {tmp<-lapply(input$c, function(x) {which(df[,'Company']==x)}); Reduce(union,tmp)}
        ind.l <- if(input$l=='') NULL else grep(input$l,df[,'Location'],ignore.case = T)
        ind.d <- which(df[,'Posted']<=input$d)
        ind.s <- {tmp<-lapply(input$s, function(x) {which(df[,'Source']==x)}); Reduce(union,tmp)}
        ind.all <- list(ind.j,ind.c,ind.l,ind.d,ind.s)
        ind <- if(is.null(ind.s)) NULL else {ind.null<- which(lapply(ind.all,is.null)==TRUE) ;Reduce(intersect,ind.all[-ind.null])}

    })

我已将ind.jind.cind.lind.dind.sind.all的结果打印到控制台,他们都产生了正确的结果。然而,当我测试ind的结果时,它并不是我所期望的,所以我想知道它的反应性或代码行是否有效。

ind打算做的是获取存储在ind.all中的所有查找索引的列表,并递归应用intersect函数以查找来自的ind.all函数index中的所有子列表。

{{1}}函数适用于各个过滤器。但是,当我输入所有索引的值时,该函数不会按预期更新到正确的索引列表。

1 个答案:

答案 0 :(得分:0)

this帖子jdharrison回答了这个问题。我将在此重申他的回答:

The problem you have is with the which function:

> which(rep(FALSE, 5))
integer(0)

您可以更改:

ind <- if(is.null(ind.s)){
  NULL
}else{
  ind.null<- which(lapply(ind.all,is.null)==TRUE)
  Reduce(intersect,ind.all[-ind.null])
}

ind <- if(is.null(ind.s)){
  NULL
}else{
  Reduce(intersect,ind.all[!sapply(ind.all,is.null)])
}