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.
Đố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ị. –