La funzione is.object
sembra solo se l'oggetto ha un attributo "class". Quindi non ha lo stesso significato dello slogan.
Per esempio:
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
Ora, cercando di rispondere alla tua domanda reale, circa lo slogan, questo è come vorrei metterlo. Tutto ciò che esiste in R
è un oggetto nel senso che è un tipo di struttura dati che può essere manipolata. Penso che questo sia meglio compreso con le funzioni e le espressioni, che di solito non vengono considerate come dati.
Prendendo un preventivo da Chambers (2008):
Il calcolo centrale in R è una chiamata di funzione, definito dall'oggetto funzione stessa e gli oggetti che vengono forniti come argomenti. Nel modello di programmazione funzionale, il risultato è definito da da un altro oggetto, il valore della chiamata. Da qui il tradizionale motto del linguaggio S: tutto è un oggetto - gli argomenti, il valore, e in effetti la funzione e la chiamata stessa: tutti questi sono definiti come oggetti . Pensa agli oggetti come raccolte di dati di tutti i tipi. I dati contenuti e il modo in cui i dati sono organizzati dipendono dalla classe da cui è stato generato l'oggetto.
Prendere questa espressione ad esempio mean(rnorm(100), trim = 0.9)
. Finché non viene valutato, è un oggetto molto simile a qualsiasi altro. Quindi puoi cambiare i suoi elementi proprio come faresti con una lista.Per esempio:
call <- substitute(mean(rnorm(100), trim = 0.9))
call[[2]] <- substitute(rt(100,2))
call
mean(rt(100, 2), trim = 0.9)
o fare una funzione, come rnorm
:
rnorm
function (n, mean = 0, sd = 1)
.Call(C_rnorm, n, mean, sd)
<environment: namespace:stats>
È possibile modificare i suoi argomenti di default, proprio come un semplice oggetto, come una lista, anche:
formals(rnorm)[2] <- 100
rnorm
function (n, mean = 100, sd = 1)
.Call(C_rnorm, n, mean, sd)
<environment: namespace:stats>
Riprendendo ancora una volta da Chambers (2008):
Il concetto chiave è che le espressioni per la valutazione sono esse stesse oggetti; nel tradizionale motto del linguaggio S, tutto è un oggetto . La valutazione consiste nel prendere l'oggetto che rappresenta un'espressione e restituire l'oggetto che è il valore di tale espressione .
Tornando al nostro esempio di chiamata, lo call
è un oggetto che rappresenta un altro oggetto. Quando viene valutato, diventa quell'altro oggetto, che in questo caso è il vettore numerico con un numero: -0.008138572.
set.seed(1)
eval(call)
[1] -0.008138572
E che ci avrebbe portato al secondo slogan, che non ha citato, ma di solito viene fornito insieme con la prima: "Tutto ciò che accade è una chiamata di funzione".
Riprendendo da Chambers (2008), egli in realtà si qualifica questa affermazione un po ':
Quasi tutto ciò che accade nei risultati di ricerca da una chiamata di funzione. Pertanto, la programmazione di base si concentra sulla creazione e sulla raffinazione delle funzioni .
Quindi, ciò significa che quasi tutte le trasformazioni di dati che si verificano in R
sono chiamate di funzione. Anche una cosa semplice, come una parentesi, è una funzione in R
.
Quindi, prendendo la parentesi come un esempio, si può effettivamente ridefinirlo a fare le cose in questo modo:
che non è una buona idea, ma illustra il punto. Quindi immagino che questo sia come vorrei riassumerlo: tutto ciò che esiste in R è un oggetto perché sono dati che possono essere manipolati. E (quasi) tutto ciò che accade è una chiamata di funzione, che è una valutazione di questo oggetto che ti dà un altro oggetto.
Per molti linguaggi di programmazione, suppongo che solo si può chiamare 'x' è una variabile , non un oggetto, se 'x' ha solo un valore. –