2012-06-27 47 views
8

Điều này có thể rơi vào "bạn không thể, và không có lý do gì cả", nhưng tôi tò mò nếu có thể. Ít nhất, có lẽ nó sẽ là một câu đố thú vị R.Làm thế nào để cà ri một đối số ... theo vị trí trong R?

Tôi đang cân nhắc việc cắt giảm cat để luôn nối thêm \n. Tuy nhiên, cat được viết để nó dán với nhau như nhiều đối số như nó được đưa ra (thông qua ...).

Đáng ngạc nhiên, công trình này:

> library(functional) 
> catnip <- Curry(cat, "\n") 
> catnip("hi") 

hi 

Tuy nhiên, \n gió lên trước khi văn bản của người dùng. Có cách nào để curry các chức năng như vậy mà bạn chỉ định các đối số curried luôn luôn kết thúc các đối số ...?

+4

Mèo đã khóc, yummmy! – John

+1

Nifty trả lời tất cả. Chủ của tôi về 'do.call' không đầy đủ nhưng đang tiến triển. Cảm ơn :-) –

Trả lời

10

Có vẻ như Curry() khá hiệu quả sẽ đánh chặn hai danh sách đối số theo thứ tự ngược lại từ những gì bạn muốn. Đó là một chức năng đủ đơn giản, mặc dù, bạn chỉ có thể xây dựng hình ảnh phản chiếu của nó và sử dụng nó thay thế.

Curry2 <- function(FUN, ...) { 
    .orig = list(...) 
    function(...) do.call(FUN, c(list(...), .orig)) 
} 

catnip <- Curry2(cat, "\n") 
catnip("hi") 
7

# 1. Bỏ qua đối số thứ hai của Curry và mã cứng dòng mới

Hãy thử đối số này là đối số cuối cùng của cat bằng cách mã hóa cứng nó trong một hàm ẩn danh. Nó không thực sự tận dụng Curry tranh cãi sau khi người đầu tiên:

catnip <- Curry(function(...) cat(..., "\n")) 

# 2. Sản xuất chức năng bằng cách tách lạng bộ một chức năng ẩn danh

Dưới đây là một giải pháp thứ hai mà món cà ri đối số cuối cùng của cat bằng cách sử dụng một chức năng ẩn danh mà sắp xếp lại lập luận cat 's.

catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n") 

# test 
catnip2("hi", "there") 

# 3. Sản xuất chức năng mong muốn bằng cách currying một chức năng cơ bản hơn

Có lẽ điểm thực của tất cả điều này là xem cách chúng ta có thể lấy các thành phần cơ bản và Curry chúng để có được những gì chúng ta muốn. Như vậy chúng ta có thể xác định một vị tướng last.arg.fun và sau đó sản xuất các chức năng mong muốn bởi một cà ri của nó:

last.arg.fun <- function(FUN, last.arg, ...) FUN(..., last.arg) 
catnip3 <- Curry(last.arg.fun, cat, "\n") 

# test 
last.arg.fun(cat, "\n", "hi", "there") 

# test 
catnip3("hi", "there") 

Chúng ta có thể làm điều đó trong hai bước này nếu chúng tôi cần last.arg.cat tại một số điểm:

last.arg.cat <- Curry(last.arg.fun, cat) 
catnip4 <- Curry(last.arg.cat, "\n") 

# test 
last.arg.cat("\n", "hi", "there") 

# test 
catnip4("hi", "there") 

Lưu ý rằng mỗi bài kiểm tra sẽ tạo ra một dòng nói hi có kết thúc bằng một dòng mới.

EDIT: nhiều giải pháp hơn.

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