R中的“存在的一切都是一个对象”的真正意义是什么?

我看见:

“To understand computations in R, two slogans are helpful:

• Everything that exists is an object.
• Everything that happens is a function call.”

— John Chambers

但是我刚刚发现:

a <- 2
is.object(a)
# FALSE

实际上,如果变量是纯基类型,则is.object()的结果将为FALSE。所以它不应该是一个对象。

那么R中的“存在的一切都是一个对象”的真正意义是什么?

函数is.object似乎只是看对象是否有一个“类”属性。所以与口号的含义不一样。

例如:

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中存在的一切都是一种对象,它是一种可以被操纵的数据结构。我认为这是更好地理解与功能和表达式,这通常不被认为是数据。

从钱伯斯(2008)引用:

The central computation in R is a function call, defined by the
function object itself and the objects that are supplied as the
arguments. In the functional programming model, the result is defined
by another object, the value of the call. Hence the traditional motto
of the S language: everything is an object—the arguments, the value,
and in fact the function and the call itself: All of these are defined
as objects. Think of objects as collections of data of all kinds. The data contained and the way the data is organized depend on the class from which the object was generated.

以此表达式为例(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):

The key concept is that expressions for evaluation are themselves
objects; in the traditional motto of the S language, everything is an
object. Evaluation consists of taking the object representing an
expression and returning the object that is the value of that
expression.

所以回到我们的调用示例,调用是代表另一个对象的对象。当被评估时,它成为另一个对象,在这种情况下,它是一个数字的数字向量,一个数字:-0.008138572。

set.seed(1)
eval(call)
[1] -0.008138572

这将带我们到第二个口号,你没有提到,但通常与第一个口号:“发生的一切都是一个函数调用”。

再次从钱伯斯(2008),他实际上有资格这个说法:

Nearly everything that happens in R results from a function call.
Therefore, basic programming centers on creating and refining
functions.

那么这意味着在R中发生的几乎所有的数据转换都是函数调用。即使是一个简单的事情,像括号一样,是R中的一个功能。

所以以括号为例,你可以重新定义它来做这样的事情:

`(` <- function(x) x + 1
(1)
[1] 2

哪个不是一个好主意,但是说明了一点。所以我想这是我的总结:R中存在的一切都是一个对象,因为它们是可以被操纵的数据。和(几乎)发生的一切都是一个函数调用,它是一个评估这个对象,它给你另一个对象。

翻译自:https://stackoverflow.com/questions/34376318/whats-the-real-meaning-about-everything-that-exists-is-an-object-in-r

转载注明原文:R中的“存在的一切都是一个对象”的真正意义是什么?