기본적으로 연산자의 오버로드를 통해 원하는 모든 동작을 얻을 수 있습니다.
# overload the brackets for reading out
"[.pmatch_vec" = function(obj,idx){
origclass <- setdiff(class(obj),"pmatch_vec")
if (length(origclass)==0) origclass <- ""
class(obj) <- origclass
if (!is.character(idx))
return(obj[idx])
else
return(obj[grep(paste("^",idx,sep=""),names(obj))])
}
# overload the assignment operator []<-
"[<-.pmatch_vec" = function(obj,idx,value){
saveclass <- class(obj)
origclass <- setdiff(class(obj),"pmatch_vec")
if (length(origclass)==0) origclass <- ""
class(obj) <- origclass
if (!is.character(idx))
obj[idx] <- value
else
obj[grep(paste("^",idx,sep=""),names(obj))] <- value
class(obj) <- saveclass
return(obj)
}
는 일반적으로 브래킷을 과부하 위험 때문에
는, 그들은 오직 정의 클래스 "pmatch_vec"과부하했다 : 다음 코드로 괄호는 당신이 그들을 행동하려는 방식으로 동작하는 오버로드. 덧붙여 말하자면, 이러한 함수 내에서 "pmatch_vec"는 무한 재귀를 피하기 위해 일시적으로 class 속성에서 제거됩니다. 여기
클래스 "pmatch_vec"이어야 정의 원자 벡터의 동작에 대한 몇 가지 예
# create some vector
A = 1:6
names(A) <- c(paste("a",1:3,sep=""),paste("b",1:3,sep=""))
# set the class
class(A) = c("pmatch_vec")
# some demonstraton
A["a"]
# a1 a2 a3
# 1 2 3
A["b"]
# b1 b2 b3
# 4 5 6
A["b"] <- 7
A
# a1 a2 a3 b1 b2 b3
# 1 2 3 7 7 7
인덱싱을 위해 사용되는 벡터 타입 문자가 아닌 경우, 클래스 "pmatch_vec는"처럼 동작 그것은 보통의 원자 벡터입니다 :
A[1:2] <- 8
A[1:4]
# a1 a2 a3 b1
# 8 8 3 7
굉장한 "grep"- 명령은 내가 찾고있는 것입니다. 내용을 이름으로 지정하지 않고도 벡터 내부를 검색 할 수 있습니다. – Zuup