Как установить атрибуты для переменной в R?

Как назначить атрибут переменной? Для EG.

> 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"

Как это, я хочу создать атрибуты для переменной и присвоить ей значение этого атрибута.

2 ответов


помимо использования attributes (см. ответ @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 классы:

> foo <- list()
> foo
list()

давайте посмотрим, что произойдет, если мы ставим атрибут class как 'data.frame'

> attr(foo, 'class') <- 'data.frame'
> foo
data frame with 0 columns and 0 rows

или мы можем определить пользовательское поведение (кстати, это поведение является причиной, почему лучше избегать точек при определении функций):

> 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

на мой взгляд, это особенно полезно, когда вы используете сторонние библиотеки. Использование атрибутов обычно плохо документировано, особенно при использовании для некоторых внутренних задач, и довольно легко ввести некоторые труднодиагностируемые ошибки, если вы используете конфликтующие имена.


Если у вас есть переменная :

x<-"some variable"

можно сделать

attributes(x)$myattrib<-"someattributes"

> x
[1] "some variable"
attr(,"myattrib")
[1] "someattributes"

или

> attributes(x)
$myattrib
[1] "someattributes"