(我希望以前没有问过这个问题)。 为方便起见,我使用缩写来表示“cn”而不是“colnames”。但是,对于colnames / rownames,缩写函数仅用于阅读目的。我无法使用新的“cn”函数设置colnames。任何人都可以解释colnames函数背后的黑魔法吗?这是一个例子:
cn <- match.fun(colnames)
x <- matrix(1:2)
colnames(x) <- "a" # OK, works.
cn(x) <- "b" # Error in cn(x) <- "b" : could not find function "cn<-"
答案 0 :(得分:1)
谢谢你,echasnovski,链接到这个伟大的网站。 它帮助我更好地理解R! http://adv-r.had.co.nz/Functions.html#replacement-functions
在R中,可以定义foo<-
之类的特殊“替换函数”。例如。我们可以定义一个函数
`setSecondElement<-` <- function(x, value){
x[2] <- value
return(x)
}
# Let's try it:
x <- 1:3
setSecondElement(x) <- 100
print(x)
# [1] 1 100 3
colnames<-
函数的工作原理基本相同。但是,“在幕后”它将检查x是否是data.frame或matrix并设置名称(x)或dimnames(x)[[2]]。只需在R中执行以下行,您就会看到基础例程。
print( `colnames<-` )
对于我的具体问题,解决方案结果非常简单。请记住,我希望colnames
的缩写版本称为cn
。我可以这样做:
cn <- match.fun(colnames);
`cn<-` <- function(x, value){
colnames(x) <- value
return(x)
}
更容易,正如StéphaneLaurent所指出的那样,`cn&lt; -`的定义可以简化为:
`cn<-` <- `colnames<-`
这些方法之间存在细微差别。第一种方法将定义一个新函数,该函数调用colnames<-
函数。第二种方法将复制colnames<-
函数的引用,即使使用cn<-
也会进行完全相同的函数调用。这种方法更有效,因为可以避免1次附加函数调用。