如何为变量分配属性?例如。
> x <- rpart(f.la, mydata)
分配属性:
$names
[1] "frame" "where"
[3] "call" "terms"
[5] "cptable" "method"
[7] "parms" "control"
[9] "functions" "numresp"
[11] "splits" "variable.importance"
[13] "y" "ordered"
$xlevels
named list()
$ylevels
[1] "cancelled" "cart-abandon" "purchased" "returned"
$class
[1] "rpart"
像这样,我想为变量创建属性并为该属性赋值。
答案 0 :(得分:17)
使用attributes
(see the answer by @CathG)时,您可以使用attr
。第一个将在NULL
个对象上工作,但第二个不会。当您使用R属性时,您必须记住,它们看起来并不简单,并且可能会产生一些有趣的副作用。快速举例:
> x <- 1:10
> class(x)
[1] "integer"
> x
[1] 1 2 3 4 5 6 7 8 9 10
到目前为止一切顺利。现在让我们设置dim
属性
> attr(x, 'dim') <- c(2, 5)
> class(x)
[1] "matrix"
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
class
属性是S3 classes的基本部分:
> foo <- list()
> foo
list()
让我们看看如果我们将属性class
设置为'data.frame'
> attr(foo, 'class') <- 'data.frame'
> foo
data frame with 0 columns and 0 rows
或者我们可以定义自定义行为(BTW这种行为是为什么在定义函数时最好避免点的原因):
> print.foo <- function(x) cat("I'm foo\n")
> attr(foo, 'class') <- 'foo'
> foo
I'm foo
comment
和names
等其他属性也有特殊含义和约束。
在这里删除消息当你使用R中的属性时你必须要小心。一个简单的想法如何处理是使用前缀作为人工命名空间:
> x <- 1:10
> attr(x, 'zero323.dim') <- c(2, 5)
> class(x)
[1] "integer"
> x
[1] 1 2 3 4 5 6 7 8 9 10
attr(, 'zero323.dim')
[1] 2 5
在我看来,当您使用第三方库时它特别有用。对属性的使用通常记录很少,特别是在用于某些内部任务时,如果使用冲突的名称,很容易引入一些难以诊断的错误。
答案 1 :(得分:6)
如果您有变量:
x<-"some variable"
你可以做到
attributes(x)$myattrib<-"someattributes"
> x
[1] "some variable"
attr(,"myattrib")
[1] "someattributes"
或
> attributes(x)
$myattrib
[1] "someattributes"