编写一个可以作为`labels(x)< - some_value`的函数

时间:2011-01-06 11:06:45

标签: r select methods

我想编写一个函数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

我该怎么办?

4 个答案:

答案 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参数,并使用此参数来设置/更改标签。

当然,所有这一切都可以使用namescolnames等完成,但如果您想了解其工作原理,那么希望上述内容有用吗?

答案 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

您需要做的是定义函数ff<-

虽然我不确定您对“标签”功能的期望,但这是最简单的替换示例:

`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