几个月前我 asked something similar ,但我使用 JavaScript 来检查提供的字符串是否是“有效”的 R 对象名称。现在我想通过只使用 R 来实现相同的目标。我想有一种非常好的方法可以做到这一点,使用一些简洁(不是那么)深奥的 R 函数,所以正则表达式在我看来是最后一道防线.有任何想法吗?

哦,是的,使用反引号之类的东西被认为是作弊。 =)

最佳答案

编辑 2013-1-9 以修复正则表达式。 以前的正则表达式,取自 John Chambers 的“数据分析软件”第 456 页,(巧妙地)不完整。 (h.t. 哈德利·威克姆)

这里有几个问题。一个简单的正则表达式可用于识别所有语法上有效的名称 --- 但其中一些名称(如 ifwhile )是“保留的”,不能分配给。

  • 识别语法上有效的名称:
    ?make.names 解释了语法上有效的名称:

    下面是对应的正则表达式:
     "^((([[:alpha:]]|[.][._[:alpha:]])[._[:alnum:]]*)|[.])$"
    
  • 识别无保留的语法有效名称
    要识别未保留的名称,您可以利用基本函数 make.names() ,该函数从任意字符串构造语法上有效的名称。
    isValidAndUnreserved <- function(string) {
        make.names(string) == string
    }
    
    isValidAndUnreserved(".jjj")
    # [1] TRUE
    isValidAndUnreserved(" jjj")
    # [1] FALSE
    
  • 将所有内容放在一起
    isValidName <- function(string) {
        grepl("^((([[:alpha:]]|[.][._[:alpha:]])[._[:alnum:]]*)|[.])$", string)
    }
    
    isValidAndUnreservedName <- function(string) {
        make.names(string) == string
    }
    
    testValidity <- function(string) {
        valid <- isValidName(string)
        unreserved <- isValidAndUnreservedName(string)
        reserved <- (valid & ! unreserved)
        list("Valid"=valid,
             "Unreserved"=unreserved,
             "Reserved"=reserved)
    }
    
    testNames <- c("mean", ".j_j", ".", "...", "if", "while", "TRUE", "NULL",
                   "_jj", "  j", ".2way")
    t(sapply(testNames, testValidity))
    
          Valid Unreserved Reserved
    mean  TRUE  TRUE       FALSE
    .j_j  TRUE  TRUE       FALSE
    .     TRUE  TRUE       FALSE
    ...   TRUE  TRUE       FALSE
    if    TRUE  FALSE      TRUE
    while TRUE  FALSE      TRUE
    TRUE  TRUE  FALSE      TRUE
    NULL  TRUE  FALSE      TRUE
    _jj   FALSE FALSE      FALSE
      j   FALSE FALSE      FALSE   # Note: these tests are for "  j", not "j"
    .2way FALSE FALSE      FALSE
    

  • 有关这些问题的更多讨论,请参阅@Hadley 在下面的评论中链接到的 the r-devel thread

    关于regex - 检查字符值是否是有效的 R 对象名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8396577/

    10-12 00:24
    查看更多