수정 된 2013-1-9 정규식 수정. John Chambers의 "Software for Data Analysis"456 페이지에서 벗어난 이전 정규식이 (미묘하게) 불완전합니다. 문제의 부부가 여기에있다
(해들리 위컴을 H.T.). 간단한 정규 표현식을 사용하여 구문 론적으로 유효한 모든 이름을 식별 할 수 있지만 일부 이름 (예 : if
및 while
)은 '예약'되어 있으므로 할당 할 수 없습니다.
- 확인 구문 적으로 유효한 이름 :
[...] 문자, 숫자로 구성하고 점이나 밑줄 문자 :
?make.names
는 구문 적으로 유효한 이름을 설명 문자 또는 숫자로 시작하는 의 점으로 시작합니다. 이러한 ' ".2way' '와 같은 명칭은 유효하지 않은 [...]
여기
해당 정규 표현식 : 제한없이 구문 유효한 이름 식별
"^([[:alpha:]]|[.][._[:alpha:]])[._[:alnum:]]*$"
예약되지 않은 이름을 식별하려면 기본 기능 make.names()
을 활용할 수 있습니다 임의의 문자열로부터 구문 적으로 유효한 이름을 생성합니다.
isValidAndUnreserved <- function(string) {
make.names(string) == string
}
isValidAndUnreserved(".jjj")
# [1] TRUE
isValidAndUnreserved(" jjj")
# [1] FALSE
아래 코멘트에 @Hadley에 링크 the r-devel thread를 참조, 이러한 문제의 많은 설명은 함께 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
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
모든 퍼팅.
는'그래, –
작동 tryCatch' 마지막에 가까운 경우 당신은 이름으로 객체를 생성하고 볼을 시도 할 수 있습니다 방어선. – aL3xa
마지막 방어선입니다. 왜?그것은 당신의 문제를 완벽하게 해결합니다. –