2012-06-27 60 views
8

這可能屬於「你不能,也沒有理由」,但我很好奇,如果有可能的話。至少,也許這將是一個有趣的R難題。如何通過在R中的位置來克服...參數?

我在琢磨柯里裏cat總是追加\n。但是,編寫cat時,它將粘貼在一起的參數數量(通過...)。

出人意料的是,這個工程:

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

hi 

然而,\n用戶的文本之前捲起。有沒有什麼辦法可以讓函數的curry來指定curried參數總是結束...參數?

+4

咖喱貓,yummmy! – John

+1

漂亮的回答所有。我對「do.call」的掌握並不完整,而是在進步。謝謝 :-) –

回答

10

看起來像Curry()非常有效地以與您所期望的相反的順序硬連接兩個參數列表。這是一個足夠簡單的功能,但您可以構建其鏡像,然後使用它。

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

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

#1。忽略Curry的第二個參數,並用硬編碼換行

嘗試通過在匿名函數中對其進行硬編碼來緩解cat的最後一個參數。它實際上並沒有使用Curry參數後的第一次:

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

#2。通過討好匿名函數

這裏製造功能是通過使用匿名功能,其進行重新排序cat的論點咖喱cat的最後一個參數的第二溶液。

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

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

#3。通過克服更基本的功能來製造所需的功能

也許這一切的真正意義在於看看我們如何獲取基本組件並將它們咖喱以獲得我們想要的。因此,我們可以定義一個通用last.arg.fun,然後通過它的咖喱製造所需的功能:

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") 

我們可以做的兩個步驟,如果我們需要last.arg.cat在某一點:

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") 

注意每個測試都應該產生一個表示hi的行,並以換行符結束。

編輯:更多的解決方案。

相關問題