我尝试创建一个反应函数,该函数从下面代码中称为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.j
,ind.c
,ind.l
,ind.d
,ind.s
和ind.all
的结果打印到控制台,他们都产生了正确的结果。然而,当我测试ind
的结果时,它并不是我所期望的,所以我想知道它的反应性或代码行是否有效。
ind
打算做的是获取存储在ind.all
中的所有查找索引的列表,并递归应用intersect
函数以查找来自的ind.all
函数index
中的所有子列表。
{{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)])
}