2012-07-19 59 views
38

Tôi đã tìm kiếm một tham chiếu để tìm hiểu về các hàm thay thế trong R, nhưng tôi chưa tìm thấy bất kỳ hàm nào. Tôi đang cố gắng để hiểu được khái niệm về các chức năng thay thế trong R. Tôi có đoạn code dưới đây nhưng tôi không hiểu nó:Chức năng thay thế trong R là gì?

"cutoff<-" <- function(x, value){ 
x[x > value] <- Inf 
x 
} 

và sau đó chúng ta gọi là cắt với:

cutoff(x) <- 65 

Could bất cứ ai giải thích những gì một chức năng thay thế là trong R?

+5

Đây là câu hỏi hoàn toàn có thể chấp nhận đối với SO –

+2

có thể trùng lặp với ['cấp <-' (Điều gì phù hợp với điều này?] (Http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this) –

+0

Xem ** Mở rộng R.- John Chambers (2016) **: * trang 73 đến 79 của Chương 5 * –

Trả lời

42

Khi bạn gọi

cutoff(x) <- 65 

bạn đang có hiệu lực kêu gọi

x <- "cutoff<-"(x = x, value = 65) 

Tên của hàm phải được trích dẫn vì nó là một tên cú pháp hợp lệ nhưng không đúng tiêu chuẩn và phân tích cú pháp sẽ giải thích <- làm toán tử không phải là một phần của tên hàm nếu nó không được trích dẫn.

"cutoff<-"() giống như bất kỳ chức năng nào khác (mặc dù có tên lạ); nó thay đổi đối số đầu vào của nó trên cơ sở value (trong trường hợp này, nó đặt bất kỳ giá trị nào trong x lớn hơn 65 thành Inf (vô hạn)).

Sự kỳ diệu thực sự được thực hiện khi bạn gọi hàm như thế này

cutoff(x) <- 65 

vì R được phân tích cú pháp đó và kéo ra các bit khác nhau để thực hiện cuộc gọi thực hiện ở trên.

More quát chúng ta có

FUN(obj) <- value 

R tìm thấy chức năng "FUN<-"() và thiết lập cuộc gọi bằng cách thông qua objvalue vào "FUN<-"() sắp xếp cho kết quả của "FUN<-"() được gán trở lại obj, do đó nó gọi :

obj <- "FUN<-"(obj, value) 

Tài liệu tham khảo hữu ích cho việc này trong hình thành là R Language Definition Section 3.4.4: Subset assignment; cuộc thảo luận hơi xiên, nhưng dường như là tài liệu tham khảo chính thức nhất (các chức năng thay thế được đề cập đến trong câu hỏi thường gặp R (sự khác biệt giữa R và S-PLUS) và tham chiếu ngôn ngữ R (các vấn đề kỹ thuật khác nhau), nhưng tôi không tìm thấy thêm bất kỳ cuộc thảo luận nào trong tài liệu chính thức).

+0

câu trả lời rất hữu ích ... Cảm ơn bạn rất nhiều. – Sam

9

Gavin cung cấp một cuộc thảo luận tuyệt vời về việc diễn giải chức năng thay thế. Tôi muốn cung cấp tài liệu tham khảo vì bạn cũng đã yêu cầu: R Language Definition Section 3.4.4: Subset assignment.

+0

Tôi đánh giá cao nó Brian – Sam

+5

hữu ích, nhưng câu trả lời chỉ liên kết ... Tôi đang chỉnh sửa câu trả lời của @ GavinSimpson để thêm nó ... –

2

Hãy nhớ rằng, trong hoạt động mọi thứ R là một cuộc gọi hàm (do đó cũng là các phép gán) và mọi thứ tồn tại là một đối tượng. chức năng thay thế hành động như thể họ thay đổi lập luận của mình ở vị trí như trong

colnames(d) <- c("Input", "Output") 

Họ có nhận dạng <- vào cuối tên của họ và trả về một bản sao sửa đổi của các đối tượng tham số (không nguyên thủy chức năng thay thế) hoặc cùng một đối tượng (chức năng thay thế nguyên thủy)

Tại dấu nhắc R, sau đây sẽ không làm việc:

> `second` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 
> x <- 1:10 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> second(x) <- 9 
Error in second(x) <- 9: couldn't find function "second<-" 

Như bạn thấy, R đang tìm kiếm môi trường không cho 012.373.nhưng đối với second<-. Vì vậy, cho phép làm điều tương tự nhưng sử dụng như một định danh chức năng thay vì:

> `second<-` <- function(x, value) { 
+ x[2] <- value 
+ x 
+ } 

Bây giờ, nhiệm vụ ở vị trí thứ hai của vector hoạt động:

> second(x) <- 9 
> x 
[1] 1 9 3 4 5 6 7 8 9 10 

Tôi cũng đã viết một kịch bản đơn giản để liệt kê tất cả các chức năng thay thế trong gói cơ sở R, find it here.

+0

Đã viết nhận xét trên blog của bạn về kịch bản để rút ra tất cả các chức năng thay thế: "Bạn không bỏ lỡ các chức năng thay thế này, có "' <-' "ở giữa? Ví dụ:' split <-. default' và 'split <-. data.frame'?" –

+0

@ManuelS Tôi đang kiểm tra: '> split <-. Data.frame Fehler: Objekt '.data.frame' nicht gefunden > split <-. Default Fehler: Objekt '.default' nicht gefunden >' – TMOTTM

+0

@ManuelS Hadley không viết bất cứ điều gì về các chức năng được đặt tên như vậy trong Advanced R. Bạn có tham chiếu cho các chức năng mà bạn đề cập không? – TMOTTM