几个月前我 asked something similar ,但我使用 JavaScript 来检查提供的字符串是否是“有效”的 R 对象名称。现在我想通过只使用 R 来实现相同的目标。我想有一种非常好的方法可以做到这一点,使用一些简洁(不是那么)深奥的 R 函数,所以正则表达式在我看来是最后一道防线.有任何想法吗?
哦,是的,使用反引号之类的东西被认为是作弊。 =)
最佳答案
编辑 2013-1-9 以修复正则表达式。 以前的正则表达式,取自 John Chambers 的“数据分析软件”第 456 页,(巧妙地)不完整。 (h.t. 哈德利·威克姆)
这里有几个问题。一个简单的正则表达式可用于识别所有语法上有效的名称 --- 但其中一些名称(如 if
和 while
)是“保留的”,不能分配给。
?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/