То, что вы, кажется, хотите, это понять замена функций.Если мы посмотрим на names
, мы также заметим, что есть также функция names<-
со следующим определением:
> `names<-`
function (x, value) .Primitive("names<-")
, которая не очень информативна о том, что она на самом деле делает, но показываетчто вы можете написать любую функцию вида foo<-
, которая заменяет некоторые компоненты объекта, к которому применяется функция.
x <- 1:6
X <- matrix(1:9, ncol = 3)
Labels <- function(obj, ...) {
UseMethod("Labels")
}
Labels.numeric <- function(obj, ...) {
names(obj)
}
Labels.matrix <- function(obj, which = c("colnames","rownames"), ...) {
if(missing(which))
which <- "colnames"
which <- match.arg(which)
if(which == "colnames") {
out <- colnames(obj)
} else {
out <- rownames(obj)
}
out
}
`Labels<-` <- function(obj, ..., value) {
UseMethod("Labels<-")
}
`Labels<-.numeric` <- function(obj, ..., value) {
names(obj) <- value
obj
}
, который можно использовать следующим образом:
> x <- 1:6
> Labels(x)
NULL
> Labels(x) <- LETTERS[1:6]
> x
A B C D E F
1 2 3 4 5 6
Матричный метод может быть следующим:
`Labels<-.matrix` <- function(obj, which = c("colnames","rownames"), ..., value) {
if(missing(which))
which <- "colnames"
which <- match.arg(which)
if(which == "colnames") {
colnames(obj) <- value
} else {
rownames(obj) <- value
}
obj
}
. Используется как:
> Labels(X)
NULL
> Labels(X) <- letters[1:3]
> X
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> Labels(X, which = "rownames") <- LETTERS[24:26]
> X
a b c
X 1 4 7
Y 2 5 8
Z 3 6 9
* 1020.с правой стороны
<-
, поэтому в определении вашей функции должен быть аргумент
value
, и используйте этот аргумент для установки / изменения меток.
Конечно, все это можно сделать с помощью names
, colnames
и т. Д., Но если вы хотите понять, как это работает, то надеюсь, что вышеперечисленное пригодится?