2014-10-27 20 views
5

Tôi đã đi qua khái niệm này một vài lần, nhưng không biết tên cho nó vì vậy không thể google nó để tìm hiểu thêm. Về cơ bản, khi nhìn qua chức năng hoặc thậm chí lệnh đơn giản người khác đã viết, tôi thường sẽ thấy một cái gì đó tương tự như sau:chức năng (x) trong R: viết một "hàm" mà không định nghĩa một hàm?

apply(dataset, 1:2, function(x) 10 * x) 

Trong trường hợp này, tôi đã có thể hình dung ra rằng bằng cách nào đó này "giả chức năng" function (x) sẽ chỉ nhân mỗi phần tử của tập dữ liệu với 10. Điều này có vẻ giống như một tính năng hữu ích, nhưng tôi vẫn không chắc chắn khi nào hoặc cách bạn sử dụng nó. Nó thực sự là một chức năng? Hay nó chỉ hoạt động trong gia đình của các chức năng? Có cái tên nào cho thứ này không?

+4

Nó được gọi là chức năng ẩn danh. Điều đó sẽ giúp với Googling. – joran

Trả lời

8

Chúng được gọi là "chức năng ẩn danh" và có, chúng là đối tượng chức năng thực, chỉ xảy ra chưa được gán cho bất kỳ biểu tượng nào trước khi được sử dụng.

Dưới đây là các bit có liên quan từ R language documentation:

Nói chung các chức năng được giao nhiệm vụ cho các biểu tượng nhưng họ không cần phải. Giá trị được trả về bởi hàm gọi hàm là một hàm. Nếu điều này không được đặt tên, nó được gọi là một hàm ẩn danh. Các hàm ẩn danh thường được sử dụng làm đối số cho các hàm khác, chẳng hạn như gia đình áp dụng hoặc bên ngoài.

Mặc dù chúng thường được sử dụng nhiều nhất trong *apply() chức năng, họ không cần phải là, như có thể thấy ở đây, ví dụ

(function(x,y){x*y + x/y})(2,5) 
# [1] 10.4 
6

Bạn có nghĩa là một (chức năng ẩn danh) lambda? Bạn có thể đặt một cái gì đó như thế này trong ~/.Rprofile tập tin của bạn:

`{` <- function(...) 
    base::`{`(
    if (length(sys.calls()) >= 4 && 
     identical(as.character(sys.call()[[1]]), "{") && 
     identical(as.character(sys.call(-4)[[1]]), "{")) 
     base::`{`(fn <- new('function'), 
     formals(fn) <- alist(x=), body(fn) <- sys.call(), fn) 
    else eval.parent(substitute(base::`{`(...))) 
) 

Sau đó, bạn có thể làm những việc như:

sapply(1:10, {{x + 5}}) 
# [1] 6 7 8 9 10 11 12 13 14 15 

Đây là gần gũi hơn với ngôn ngữ như Ruby hay Coffeescript mà không cần phải gọi một từ khóa để làm cho một lambda (có họ sử dụng -> nhưng điều này đã được thực hiện trong R vì vậy tôi đã sử dụng đôi niềng răng). Tôi chỉ nghĩ ra điều này nếu có lỗi cho tôi biết.

+2

Điều này có thể không giúp ích gì cả nhưng đó là một ý tưởng thú vị. Bản thân tôi, [Tôi là một phần của quá tải '->'.] (Https://gist.github.com/klmr/25dc765211c59bb749b0) –

+0

Vấn đề của tôi là hầu hết những người tôi làm việc với thực sự sử dụng '->' cho việc gán khi ngẫu nhiên lao vào bàn điều khiển - dễ hơn là quay lại đầu –

+0

Tôi đoán bạn có thể biến '%>%' thành 'cơ sở :: \' <- \ ''? –

Các vấn đề liên quan