Ответ 1
Функция is.object
выглядит только для того, чтобы объект имел атрибут "class". Таким образом, это не то же значение, что и в слогане.
Например:
x <- 1
attributes(x) # it does not have a class attribute
NULL
is.object(x)
[1] FALSE
class(x) <- "my_class"
attributes(x) # now it has a class attribute
$class
[1] "my_class"
is.object(x)
[1] TRUE
Теперь, пытаясь ответить на ваш реальный вопрос, о лозунге, я так выразился. Все, что существует в R
, является объектом в том смысле, что это своего рода структура данных, с которой можно манипулировать. Я думаю, что это лучше понять с функциями и выражениями, которые обычно не считаются данными.
Цитата из Chambers (2008):
Центральное вычисление в R является вызовом функции, определяемым сам объект функции и объекты, которые поставляются в качестве аргументы. В модели функционального программирования определяется результат другим объектом, значением вызова. Следовательно, традиционный девиз языка S: все - объект - аргументы, значение, и фактически функция и сам вызов: все они определены как объекты. Думайте о объектах как о коллекциях данных всех видов. Данные, содержащиеся и способ организации данных, зависят от класса, из которого был сгенерирован объект.
Возьмем это выражение, например mean(rnorm(100), trim = 0.9)
. Пока это не оценено, это объект, очень похожий на любой другой. Таким образом, вы можете изменить свои элементы так же, как вы делали бы это со списком. Например:
call <- substitute(mean(rnorm(100), trim = 0.9))
call[[2]] <- substitute(rt(100,2 ))
call
mean(rt(100, 2), trim = 0.9)
Или возьмите функцию, например rnorm
:
rnorm
function (n, mean = 0, sd = 1)
.Call(C_rnorm, n, mean, sd)
<environment: namespace:stats>
Вы можете изменить свои аргументы по умолчанию так же, как простой объект, например, список:
formals(rnorm)[2] <- 100
rnorm
function (n, mean = 100, sd = 1)
.Call(C_rnorm, n, mean, sd)
<environment: namespace:stats>
Принимая еще один раз от Chambers (2008):
Основная концепция заключается в том, что выражения для оценки сами объекты; в традиционном девизе языка S, все это объект. Оценка состоит из взятия объекта, представляющего выражение и возвращает объект, который является значением этого выражение.
Итак, возвращаясь к нашему примеру, call
- это объект, представляющий другой объект. При оценке он становится тем другим объектом, который в этом случае является числовым вектором с одним номером: -0.008138572.
set.seed(1)
eval(call)
[1] -0.008138572
И это приведет нас ко второму слогану, о котором вы не упомянули, но обычно приходит вместе с первым: "Все, что происходит, это вызов функции".
Взяв снова из Chambers (2008), он действительно немного квалифицирует это утверждение:
Почти все, что происходит в R, возникает из вызова функции. Поэтому основные программные центры по созданию и уточнению функции.
Итак, это означает, что почти каждое преобразование данных, которое происходит в R
, является вызовом функции. Даже простая вещь, такая как скобка, является функцией в R
.
Итак, беря скобку как пример, вы можете реально переопределить ее, чтобы сделать что-то вроде этого:
`(` <- function(x) x + 1
(1)
[1] 2
Это не очень хорошая идея, но иллюстрирует суть. Поэтому я предполагаю, что это как бы я подвел итог: все, что существует в R, является объектом, потому что это данные, которыми можно манипулировать. И (почти) все, что происходит, это вызов функции, который является оценкой этого объекта, который дает вам другой объект.