首页 > 解决方案 > R 警告:条件的长度 > 1,并且只会使用第一个元素。外功能

问题描述

我有以下两个功能:

name_fitting <- function(term1, term2)
  {
    if (nchar(term1) <= 3)
      {
       temp <- substring(term2, 1,nchar(term1))
       return(temp==term1)
      }
    else {return(grepl(term1, term2))}
  }

name_matching <- function(name1, name2)
  {
    name1 <- gsub('[[:punct:]]+','', name1)
    name2 <- gsub('[[:punct:]]+','', name2)
    if (length(intersect(as.character(unlist(strsplit(name1, ' '))), as.character(unlist(strsplit(name2, ' '))))) > 1) {return(TRUE)}
    if (length(intersect(as.character(unlist(strsplit(name1, ' '))), as.character(unlist(strsplit(name2, ' '))))) == 1) 
        {
          non_matching <- union(setdiff(as.character(unlist(strsplit(name1, ' '))), as.character(unlist(strsplit(name2, ' ')))), setdiff(as.character(unlist(strsplit(name2, ' '))), as.character(unlist(strsplit(name1, ' ')))))
          temp <- outer(X = non_matching, Y = non_matching, FUN = 'name_fitting')
          diag(temp)<-FALSE
          return(any(temp))
        }
    else(return(FALSE))
  }

name_fitting 用于 name_matching。name_matching 检查传递给函数的两个名称是否兼容并返回 TRUE 或 FALSE。

当我尝试匹配以下两个名称时:

name1<-"MARCO BRAMBILLA" 
name2<-"M BRAMBILLA BRANDUARDI"

我收到以下警告:

条件的长度 > 1 并且只使用第一个元素

表示外部函数没有正确地将数据传递给 name_fitting。

我该如何解决?

标签: rmatrixtextmatching

解决方案


您的函数将 name_fitting 传递给non_matching包含三个元素的字符向量:[1] "MARCO" "M" "BRANDUARDI". 这个向量被传递给ifcall if (nchar(term1) <= 3)。问题是它nchar(term1) <= 3给出了一个长度为 3: 的向量[1] FALSE TRUE FALSE

当然,问题是你想在这里实现什么。如果您想弄清楚 term1 是否具有三个或更多元素,请替换ncharlength. 如果您试图查看 non_matching 的任何元素是否为 3 个字符或更少,请将 nchar() 调用放在any(). 如果您试图仅检查 non_matching 的第一个元素,请通过term1[1]而不是term1.


推荐阅读