从包含文本元素

时间:2015-09-24 00:27:42

标签: r grep shiny

我可能会以愚蠢的方式解决这个问题,但请耐心等待。我在selectizeInput中使用shiny,因此用户可以选择多个类别。这些选择用于对数据帧进行子集化。在尝试matchpmatch以及%in%查找文字模式后,我决定使用grep。当项目有多个类别时,它能够找到正确的行。 然而,模式参数的长度不能超过1.解决方法?在模式中的元素之间添加|(或运算符)。我需要帮助,以便在向量的元素之间插入|,以便在grep时使用length(input$Category)>1对数据帧进行子集化。

实施例

df <- data.frame(title = 1:5, category = c("ab", "bcd", "efg","ab,bcd","efg"))

选择的类别

cate <- c("bcd")
df[grep(cate,x = df$category),]

效果很好!

但是,如果有人要选择多个类别,grep只使用模式中的第一个元素:

cate <- c("bcd","efg")
df[grep(cate,x = df$category),]

失败

除非我们在所选类别

之间添加|
cate <- c("bcd|efg")
df[grep(cate,x = df$category),]  

成功

我无法弄清楚如何以编程方式在cate的元素之间添加|而不会使if语句变得非常混乱。

 if(length(cate)== 1){
    df[grep(cate,x = df$category),])
    } else {
    if(length(cate) == 2){
      cate2 <- paste(cate[[1]],"|",cate[[2]], sep = "")
      df[grep(cate2,x = df$category),]
    } else {...

必须有一些方法来生成模式:

paste(cate[[1]],"|",cate[[2]],...,"|",cate[[n]], sep = "")

1 个答案:

答案 0 :(得分:0)

我不是百分之百确定你正在做什么,因此不能指出你的“更好”的解决方案,但为了你的目的,我很确定这样做的一些事情会:

cate <- character()
cate[1] <- c("ab")
cate[2] <- c("efg")
cate[3] <- c("ab")

do.call(what = paste, c(list(cate), collapse = "|"))
相关问题