Есть ли более простой способ доступа к атрибутам класса в R, могу ли я использовать точечную запись? - PullRequest
25 голосов
/ 23 июня 2011

Я создал объект в R, который содержит несколько атрибутов. Как я могу легко получить к ним доступ?

Я могу сделать:

attr(x, attributeName)

или

attributes(x)$attributeName

но ни один из них не очень удобен.

Есть ли более быстрый путь (например, точка в C ++ или Java)?

Ответы [ 4 ]

17 голосов
/ 23 июня 2011

attributes() возвращает именованный список. Я бы позвонил один раз и сохранил их, а затем получил доступ через имена. Нет смысла повторно звонить либо attr(), либо attributes(), если вам не нужно.

x <- 1:10
attr(x, "foo") <- "a"
attr(x, "bar") <- "b"
(features <- attributes(x))

, что дает:

R> (features <- attributes(x))
$foo
[1] "a"

$bar
[1] "b"

затем доступ обычным способом

R> features["foo"]
$foo
[1] "a"

R> features$foo
[1] "a"
12 голосов
/ 23 июня 2011

Не используйте атрибуты для вашего объекта, используйте список:

myobj <- structure(list(a = 1, b = 2), class = "myclass")
print.myclass <- function(x, ...) cat("A: ", x$a, " B: ", x$b, "\n", sep = "")
myobj

Конечно, это может не сработать, если вы расширяете существующий объект (например, вектор), но, по моему опыту, в целом это лучший способ создания объектов.

9 голосов
/ 23 июня 2011

, вероятно, нет встроенной функции, которая является противоположной частью.в C ++, но вы можете определить это так:

> `%.%` <- function(o, a) attr(o, as.character(substitute(a)))
> x <- 1
> attr(x, "orz") <- 2
> x%.%orz
[1] 2
2 голосов
/ 31 января 2014

Пример использования атрибута match.length, который возвращается из regexpr:

Три строки в векторе, первая и третья, включают встроенную строку:

data=c("<a href=\"ch4.html\">Chapter 1</a>",
       "no quoted string is embedded in this string",
       "<a   href=\"appendix.html\">Appendix</a>")

Используйте regexpr для поискавстроенные строки:

> locations <- regexpr("\"(.*?)\"", data)

Совпадения в первой строке (9 с длиной 10) и третьей строке (11 с длиной 15):

> locations
[1]  9 -1 11
attr(,"match.length")
[1] 10 -1 15
attr(,"useBytes")
[1] TRUE

Вектор из атрибута:

> attr(locations,"match.length")
[1] 10 -1 15

Используйте substr и вектор атрибутов для извлечения строк:

> quoted_strings=substr( data, 
                         locations, 
                         locations+attr(locations,"match.length")-1 )    
> quoted_strings
[1] "\"ch4.html\""      ""                  "\"appendix.html\""

Возможно, вы хотите удалить встроенные символы кавычек из строк:

> gsub("\"", "", quoted_strings)
[1] "ch4.html"      ""              "appendix.html"

Альтернативой является использование соответствия:

> regmatches(data,locations)
[1] "\"ch4.html\""      "\"appendix.html\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...