我想编写一个函数labels
,其工作原理如下:
x <- 1:6
labels(x)
# [1] 1 2 3 4 5 6
labels(x) <- 2:7
labels(x)
# [1] 2 3 4 5 6 7
labels(x)[1:2] <- 9:10
labels(x)
# [1] 9 10 4 5 6 7
我该怎么办?
答案 0 :(得分:6)
您似乎想要了解替换功能。如果我们查看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
诀窍是要记住,使用value
参数调用替换函数,该参数采用<-
右侧的值,因此您的函数定义需要value
参数,并使用此参数来设置/更改标签。
当然,所有这一切都可以使用names
,colnames
等完成,但如果您想了解其工作原理,那么希望上述内容有用吗?
答案 1 :(得分:2)
如果用“名称”替换“标签”,它将立即生效。
x <- 1:6
names(x)
names(x) <- 2:7
# and now that x "names" will be 2:7
names(x)[1:2] <- 9:10 # being able to do this is really cool
x
9 10 4 5 6 7
1 2 3 4 5 6
?名称对于许多R对象是通用的:向量,列表,data.frames,并且每个对象都支持[和[[,并且可以很容易地应用于新的类和方法。
答案 2 :(得分:2)
这是一个例子:
`f` <- function(x) {
x$a
}
`f<-` <- function(x, value){
x$a <- value
x
}
然后,
> d <- data.frame(a=1:3, b=3:1)
> f(d) <- 2
> print(d)
a b
1 2 3
2 2 2
3 2 1
>
> f(d)[3] <- 3
> print(d)
a b
1 2 3
2 2 2
3 3 1
您需要做的是定义函数f
和f<-
。
虽然我不确定您对“标签”功能的期望,但这是最简单的替换示例:
`labels` <- function(x) x
`labels<-` <- function(x, value) x <- value
然后,
> x <- 1:6
> labels(x)
[1] 1 2 3 4 5 6
> labels(x) <- 2:7
> x
[1] 2 3 4 5 6 7
> labels(x)[1:2] <- 9:10
> x
[1] 9 10 4 5 6 7
答案 3 :(得分:0)
我可能不太了解你的问题,但我认为你需要一个因素,它有价值和标签(等级)。 E.g:
> x <- as.factor(1:7)
> x
[1] 1 2 3 4 5 6 7
Levels: 1 2 3 4 5 6 7
> levels(x)
[1] "1" "2" "3" "4" "5" "6" "7"
> levels(x)[1:2] <- 9:10
> x
[1] 9 10 3 4 5 6 7
Levels: 9 10 3 4 5 6 7
> as.numeric(x)
[1] 1 2 3 4 5 6 7