2015-12-19 36 views
20

我看到:R中「存在的所有東西都是對象」的真正含義是什麼?

「要理解R中的計算,兩個口號是有益的:存在

•一切都是對象。出現這種情況
•一切都是函數調用「

- 約翰·錢伯斯

我剛剛找到:

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

事實上,如果一個變量是一個純粹的基本類型,它的結果因此它不應該是一個對象

那麼R中所有存在的東西都是一個對象的真正含義是什麼?

+0

對於很多編程語言,我想你只能叫「X」是一個變量,而不是一個對象,如果'x'只有一個值。 –

回答

19

函數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中存在的所有東西都是一個對象,它是一種可以被操縱的數據結構。我認爲通過函數和表達式可以更好地理解這些函數和表達式,而這些函數和表達式通常不被視爲數據。

以從庭(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> 

再次從錢伯斯(2008年):

關鍵概念是用於評估的表達式本身是 對象;在S語言的傳統格言中,一切都是 對象。評估包括採用代表 表達式的對象並返回該表達式值的對象。

因此,回到我們的調用示例中,call是表示另一個對象的對象。評估時,它變成另一個對象,在這種情況下,它是具有一個數字的數字向量:-0.008138572。

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

這將我們帶到第二個口號,你不提,但通常與第一個走到一起:「所發生的一切是一個函數調用」。

錢伯斯(2008年)再次考慮,他其實有資格這個說法有點:

R中結果恰好從一個函數調用幾乎應有盡有。 因此,基本的編程中心將創建和改進 的功能。

那麼這意味着幾乎每個在R中發生的數據轉換都是函數調用。即使是簡單的東西,如括號,也是R中的一項功能。

因此,採取的括號像一個例子,實際上你可以重新定義它做的事情是這樣的:

這不是一個好主意,但說明了這一點。所以我想這就是我如何總結它:R中存在的所有東西都是一個對象,因爲它們是可以被操縱的數據。 (幾乎)所發生的一切都是一個函數調用,它是對這個對象的評估,它給你另一個對象。

+0

很好理解,讓我想一想。 –

+0

Hi @Carlos,我想現在我知道R中「對象」的定義。正如你所說的,一個對象只是一種可以被操縱的數據結構。這與其他語言完全不同,例如Python,Ruby,Java。我想這是因爲R有不同的課程體系。 –

+0

和is.object(x)是FALSE,僅表示該對象還沒有屬性。而已。實際上,我不認爲R有真正的課堂系統,R不需要它。由於它是一種功能性語言,所有的類系統都只是語法糖,並且有點難看。 –

9

我喜歡那句話。

在另一個(如現在未公佈的)寫,筆者繼續

R具有用於表示所有對象的均勻的內部結構。評估過程以一種簡單的形式鍵入該結構,其實質上是由函數調用組成的 ,其中對象作爲參數和對象作爲 值。瞭解R中對象和函數的中心作用使得對任何具有挑戰性的應用程序使用該軟件更有效,甚至那些擴展R也不是目標的應用程序。

但後來花費了幾百頁來擴展它。這將是一個偉大的閱讀一旦完成。

7

對象對於x爲對象意味着它有一個類從而class(x)返回爲每個對象的類。即使函數有一類是做環境和其他物體人們可能沒有想到:

class(sin) 
## [1] "function" 

class(.GlobalEnv) 
## [1] "environment" 

我不會付出太多關注is.objectis.object(x)與我們在此處使用的含義略有不同 - 如果x的內部類名與其值一起存儲,則返回TRUE。如果存儲了類,那麼class(x)返回存儲的值,如果不存在,那麼class(x)將從該類型計算它。從概念的角度來看,重要的不是班級如何在內部表現出來(存儲或計算機) - 重要的是,在這兩種情況下,x仍然是一個對象,並且仍然有一個類。

函數所有計算都是通過函數發生的,即使你可能不希望成爲函數的東西實際上也是函數。例如,當我們寫:

{ 1; 2 } 
## [1] 2 

if (pi > 0) 2 else 3 
## [1] 2 

1+2 
## [1] 3 

我們實際上做的{if+函數調用:

`{`(1, 2) 
## [1] 2 

`if`(pi > 0, 2, 3) 
## [1] 2 

`+`(1, 2) 
## [1] 3 
相關問題