有沒有辦法實現原子矢量中的部分匹配?我知道$運算符在原子向量上不起作用,但我認爲使用[[「i」,exact = FALSE]]是可能的。原子矢量中的部分匹配
x <- c("a1", "a2", "a3", "b1", "b2")
names(x) <- x
x$a
剛剛返回 「$操作是原子向量無效」
x[["a", exact=FALSE]]
返回 「對象 」一個「 未找到」。
有沒有辦法做這樣的原子載體部分匹配?
乾杯, Zuup
有沒有辦法實現原子矢量中的部分匹配?我知道$運算符在原子向量上不起作用,但我認爲使用[[「i」,exact = FALSE]]是可能的。原子矢量中的部分匹配
x <- c("a1", "a2", "a3", "b1", "b2")
names(x) <- x
x$a
剛剛返回 「$操作是原子向量無效」
x[["a", exact=FALSE]]
返回 「對象 」一個「 未找到」。
有沒有辦法做這樣的原子載體部分匹配?
乾杯, Zuup
我不知道的東西,不正是你想要的。下面是一個有點缺憾,但可能會爲你工作:
x[grep("^a", names(x))]
# a1 a2 a3
# "a1" "a2" "a3"
另外,可以做部分匹配,但如果只有一個索引條目,你的部分指數匹配它纔會起作用。因此,例如:
y <- 1:5
names(y) <- paste(letters[1:5], 1:5)
y[["a", exact=F]]
# [1] 1
names(y)[[2]] <- "a 2" # add a second index that starts with "a"
y[["a", exact=F]]
# Error in y[["a", exact = F]] : subscript out of bounds
最後要注意,你需要引用內部[[
,你沒有在你的例子做的字符串。
基本上,通過運營商的重載,你可以得到你想要的任何行爲。用下面的代碼括號超載的行爲,你想他們的行爲方式:
# 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」會暫時從類屬性中刪除,以避免無限遞歸。
下面是原子矢量定義爲類「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
謝謝你的回答!我沒有意識到,通過重載來按照你想要的方式彎曲代碼是很容易的。這對我來說有點問題,因爲它應該在一個軟件包中工作,而且我對引入像這樣的重載通用運算符有點謹慎!但我會記住你的建議,我會遇到另一個問題,我不能用常規代碼繞開:) – Zuup
令人敬畏的「grep」命令正是我所期待的。甚至可以在矢量本身內搜索而不必將內容分配爲名稱。 – Zuup