使用匹配条件在R中Grep

时间:2014-04-17 01:00:25

标签: r grep

我在R中使用tm并希望稍微更改一下stemCompletion函数。 目前我有一个字符串

    x <- c('everi','new')

和模式

   dictionary <- c ('every','everyone','new')

当我在stemCompletion中运行代码中的构建时,正在运行的函数是以下

   possibleCompletions <- lapply(x, function(w) grep(sprintf("^%s", w),
                                                  dictionary,
                                                  value = TRUE))
   structure(sapply(possibleCompletions, "[", 1), names = x)

,结果是

   everi   new 
   NA "new"

我想更改函数,以便如果grep没有为x的特定值找到任何内容 然后它尝试取出字符串的最后一个值。在我的情况下,永远&#39;而不是&#39; everi&#39; 我尝试了这段代码,但它不起作用。

   substrLeft <- function(x, n) { substr(x, 1, nchar(x)-n) }

   possibleCompletions <- lapply(x, function(w) 

   if (grepl(sprintf("^%s", w),dictionary,fixed = FALSE) = FALSE) {
   grep(sprintf("^%s", substrLeft(w,1)),dictionary,value = TRUE,fixed = FALSE)
   } else {
   grep(sprintf("^%s", w),dictionary,value = TRUE,fixed = FALSE, invert = TRUE)
   })

   structure(sapply(possibleCompletions, "[", 1), names = x)

谢谢大家。

1 个答案:

答案 0 :(得分:0)

基本上你有一些语法问题。

  1. 首先,=是作业,==进行比较。
  2. 此外,ℝ中的if条件是according to the manual“单个逻辑值”。所以你可以通过在括号((grepl(sprintf("^%s", w),dictionary,fixed = FALSE) == FALSE))中包装比较来解决这个问题,但是你会收到警告,因为grepl会产生一个长度为2的列表。
  3. 最后,您的单行函数已扩展为多行,因此您需要将其包装在{}中:
  4. possibleCompletions <- lapply(x, function (w) {
    +     if ((grepl(sprintf("^%s", w),dictionary,fixed = FALSE) == FALSE) ) {
    +         grep(sprintf("^%s", substrLeft(w,1)),dictionary,value = TRUE,fixed = FALSE)
    +     } else {
    +         grep(sprintf("^%s", w),dictionary,value = TRUE,fixed = FALSE, invert = TRUE)
    +     }
    + })
    Warning messages:
    1: In if ((grepl(sprintf("^%s", w), dictionary, fixed = FALSE) == FALSE)) { :
      the condition has length > 1 and only the first element will be used
    2: In if ((grepl(sprintf("^%s", w), dictionary, fixed = FALSE) == FALSE)) { :
      the condition has length > 1 and only the first element will be used
    > str(possibleCompletions)
    List of 2
     $ : chr [1:2] "every" "everyone"
     $ : chr "new"