2015-12-19 14 views
20

tôi thấy:Ý nghĩa thực sự về 'Mọi thứ tồn tại là một đối tượng' trong R?

“Để hiểu được tính trong R, hai các khẩu hiệu rất hữu ích:

• Tất cả những gì tồn tại là một đối tượng.
• Tất cả những gì xảy ra là một cuộc gọi chức năng "

- John Chambers

Nhưng tôi chỉ tìm thấy:.

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

Trên thực tế, nếu một biến là một loại cơ sở trong sạch, đó là kết quả is.object() sẽ là FALSE.Vì vậy, nó không phải là một đối tượng

Vậy ý nghĩa thực sự về 'Mọi thứ tồn tại là một đối tượng' trong R?

+0

Đối với nhiều ngôn ngữ lập trình, tôi cho rằng bạn chỉ có thể gọi là 'x' là một biến , không phải là một đối tượng, nếu 'x' chỉ có một giá trị. –

Trả lời

19

Chức năng is.object dường như chỉ xem xét đối tượng có thuộc tính "lớp" hay không. Vì vậy, nó không có ý nghĩa giống như trong khẩu hiệu.

Ví dụ:

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 

Bây giờ, cố gắng trả lời câu hỏi thực sự của bạn, về khẩu hiệu, đây là cách tôi sẽ đặt nó. Mọi thứ tồn tại trong R là một đối tượng theo nghĩa là nó là một loại cấu trúc dữ liệu có thể được điều khiển. Tôi nghĩ điều này được hiểu rõ hơn với các chức năng và biểu thức, thường không được coi là dữ liệu.

Lấy một trích dẫn từ Chambers (2008):

Các tính toán trung tâm trong R là một cuộc gọi chức năng, xác định bởi các đối tượng chức năng riêng của mình và các đối tượng được cung cấp như đối số. Trong mô hình lập trình chức năng, kết quả được xác định bởi một đối tượng khác, giá trị của cuộc gọi. Do đó phương châm truyền thống của ngôn ngữ S: mọi thứ đều là một đối tượng — đối số, giá trị, và trên thực tế chức năng và chính cuộc gọi: Tất cả những điều này được xác định là làm đối tượng. Hãy suy nghĩ về các đối tượng như các bộ sưu tập dữ liệu của tất cả các loại. Dữ liệu chứa và cách dữ liệu được tổ chức phụ thuộc vào lớp mà từ đó đối tượng được tạo ra.

Lấy biểu thức này ví dụ mean(rnorm(100), trim = 0.9). Cho đến khi nó được đánh giá, nó là một đối tượng rất giống với bất kỳ đối tượng nào khác. Vì vậy, bạn có thể thay đổi các yếu tố của nó giống như bạn sẽ làm điều đó với một danh sách.Ví dụ:

call <- substitute(mean(rnorm(100), trim = 0.9)) 
call[[2]] <- substitute(rt(100,2)) 
call 
mean(rt(100, 2), trim = 0.9) 

Hoặc lấy một chức năng, như rnorm:

rnorm 
function (n, mean = 0, sd = 1) 
.Call(C_rnorm, n, mean, sd) 
<environment: namespace:stats> 

Bạn có thể thay đổi đối số mặc định của nó giống như một đối tượng đơn giản, giống như một danh sách, quá:

formals(rnorm)[2] <- 100 
rnorm 
function (n, mean = 100, sd = 1) 
.Call(C_rnorm, n, mean, sd) 
<environment: namespace:stats> 

lấy thêm một lần nữa từ Chambers (2008):

Khái niệm then chốt là các biểu thức để đánh giá tự là các đối tượng ; theo phương châm truyền thống của ngôn ngữ S, mọi thứ đều là đối tượng . Đánh giá bao gồm lấy đối tượng biểu thị biểu thức và trả về đối tượng là giá trị của biểu thức đó.

Vì vậy, quay lại ví dụ cuộc gọi của chúng tôi, call là một đối tượng đại diện cho một đối tượng khác. Khi được đánh giá, nó trở thành đối tượng khác, trong trường hợp này là vectơ số với một số: -0.008138572.

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

Và điều đó sẽ đưa chúng ta đến khẩu hiệu thứ hai mà bạn không đề cập đến, nhưng thường đi kèm với câu khẩu hiệu đầu tiên: "Mọi thứ xảy ra là cuộc gọi hàm".

Lấy một lần nữa từ Chambers (2008), ông thực sự đủ điều kiện tuyên bố này một chút:

Gần tất cả những gì xảy ra trong kết quả R từ một cuộc gọi chức năng. Do đó, các trung tâm lập trình cơ bản về cách tạo và tinh chỉnh các chức năng .

Điều đó có nghĩa là hầu hết mọi chuyển đổi dữ liệu xảy ra trong R là cuộc gọi hàm. Ngay cả một điều đơn giản, giống như dấu ngoặc đơn, là một hàm trong R.

Vì vậy, lấy ngoặc như một ví dụ, bạn có thể thực sự định nghĩa lại nó để làm những việc như thế này:

Mà không phải là một ý tưởng tốt nhưng minh họa điểm. Vì vậy, tôi đoán đây là cách tôi sẽ tổng hợp nó: Mọi thứ tồn tại trong R là một đối tượng bởi vì chúng là dữ liệu có thể được điều khiển. Và (gần như) tất cả mọi thứ xảy ra là một cuộc gọi hàm, đó là một đánh giá của đối tượng này mang lại cho bạn một đối tượng khác.

+0

hiểu biết tốt, hãy để tôi suy nghĩ về nó. –

+0

Xin chào @Carlos, tôi cho rằng bây giờ tôi biết định nghĩa của "đối tượng" trong R. Như bạn đã nói, một đối tượng chỉ là một loại cấu trúc dữ liệu có thể được điều khiển. Điều đó hoàn toàn khác với các Ngôn ngữ khác, như Python, Ruby, Java. Tôi cho rằng đó là vì R có hệ thống lớp khác nhau. –

+0

và is.object (x) là FALSE, chỉ có nghĩa là đối tượng này chưa có thuộc tính. Đó là nó. Và thực ra, tôi không nghĩ R có hệ thống lớp thực, và R không cần nó. Vì nó là một ngôn ngữ chức năng, tất cả các hệ thống lớp học chỉ là cú pháp, và một chút xấu xí. –

9

Tôi thích câu nói đó.

Trong khác (như của bây giờ chưa được công bố) viết lên, tác giả tiếp tục với

R có cấu trúc nội bộ đồng phục cho đại diện cho tất cả đối tượng. Quá trình đánh giá khóa cấu trúc đó, theo một dạng đơn giản về cơ bản là bao gồm các cuộc gọi hàm, với các đối tượng làm đối số và một đối tượng làm giá trị . Hiểu được vai trò trung tâm của các đối tượng và chức năng trong R làm cho việc sử dụng phần mềm hiệu quả hơn đối với bất kỳ ứng dụng khó khăn nào, ngay cả những ứng dụng mở rộng R cũng không phải là mục tiêu.

nhưng sau đó dành hàng trăm trang mở rộng trên đó. Nó sẽ là một lần đọc tuyệt vời khi hoàn thành.

7

Objects Đối x là một đối tượng có nghĩa là nó có một lớp như vậy class(x) lợi nhuận một lớp học cho mọi đối tượng. chức năng thậm chí có một lớp như làm môi trường và các đối tượng khác người ta có thể không mong đợi:

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

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

tôi sẽ không trả quá nhiều sự chú ý đến is.object. is.object(x) có ý nghĩa hơi khác so với những gì chúng tôi đang sử dụng ở đây - nó trả về TRUE nếu x có tên lớp được lưu trữ nội bộ cùng với giá trị của nó. Nếu lớp được lưu trữ thì class(x) trả về giá trị được lưu trữ và nếu không thì class(x) sẽ tính giá trị đó từ loại. Từ góc nhìn khái niệm, nó quan trọng không phải cách lớp được biểu diễn trong nội bộ (được lưu trữ hoặc máy tính) - điều quan trọng là trong cả hai trường hợp x vẫn là một đối tượng và vẫn có một lớp.

Chức năng Đó là tất cả tính toán xảy ra thông qua các hàm đề cập đến thực tế là ngay cả những thứ mà bạn có thể không mong đợi là chức năng thực sự hoạt động. Ví dụ khi chúng ta viết:

{ 1; 2 } 
## [1] 2 

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

1+2 
## [1] 3 

chúng tôi đang thực sự làm cho lời gọi các chức năng {, if+:

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

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

`+`(1, 2) 
## [1] 3 
Các vấn đề liên quan