Есть ли более простой способ доступа к атрибутам класса в R, можно ли использовать точечную нотацию?

21

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

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

attr(x, attributeName)

или

attributes(x)$attributeName

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

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

    
задан RockScience 23.06.2011 в 07:05
источник

4 ответа

13

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

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

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

    
ответ дан hadley 23.06.2011 в 18:21
  • существует ли простой рабочий процесс для классов S4? –  Matt Bannert 30.11.2012 в 22:09
  • Вопрос заключается в том, как получить доступ к атрибутам. Ваш ответ «не делай этого», который не является ответом на заданный вопрос. Есть другие люди, которые ищут ответы на один и тот же вопрос. –  Geoffrey Anderson 12.12.2016 в 02:16
9

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"
    
ответ дан Gavin Simpson 23.06.2011 в 10:55
8

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

> '%.%' <- function(o, a) attr(o, as.character(substitute(a)))
> x <- 1
> attr(x, "orz") <- 2
> x%.%orz
[1] 2
    
ответ дан kohske 23.06.2011 в 07:49
  • Спасибо. Теперь я смотрю классы S4, которые allo object @ attr –  RockScience 23.06.2011 в 09:58
  • Выбор системы классов, основанной на доступе к атрибутам / полям / слотам, вероятно, не самый лучший способ принять решение. –  hadley 23.06.2011 в 18:22
2

Пример использования атрибута 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:

> regmatches(data,locations)
[1] "\"ch4.html\""      "\"appendix.html\""
    
ответ дан Jeff Taylor 31.01.2014 в 19:31