2014-01-08 52 views
1

R中的所有連接函數都可以重寫爲遞歸函數。例如,我可以用c二元運算符,我可以定義一個新的concat功能R中用戶定義類的遞歸連接方法?

concat <- function(...) { 
    Reduce(c, ...) 
} 

concat會爲c實際上R基本職能發揮作用。

R語法上使用了許多這樣的函數,例如向量和列表的c,陣列,數據框架和矩陣的cbind。在定義新的對象類時,創建一個方法可以使用一個以...作爲參數的函數進行組合。

我知道R可以匹配方法的對象,當他們在參數列表中的第一個對象,但如果我這樣定義

concat <- function(...) { 
    UseMethod('concat') 
} 

concat.numeric <- function(...) { 
    c(...) 
} 

concat.character <- function(...) { 
    c(...) 
} 

myCon <- function(charPart, numPart) { 
    out <- list(charPart=charPart, numPart=numPart) 
    class(out) <- "myClass" 
    out 
} 

concat.myClass <- function(...) { 
    myCon(sapply(..., `[[`, 'charPart'), sapply(..., `[[`, 'numPart')) 
} 

> concat(4, 6, 'a') 
"4" "6" "a" 

> myObj1 <- myCon('a', 1) 
> myObj2 <- myCon('b', 2) 

> concat(myObj1, myObj2) 
Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'p' of mode 'function' was not found 

在什麼點的方法確實[R標識類型的供給參數concat?我如何說服R嘗試將參數投射到concat直到我的特定對象類?

回答

1

你並不完全通過你想到的sapply你需要把它放在list(...)中,所以sapply可以迭代元素而不是將它們解析爲錯誤位置的額外參數。

concat.myClass <- function(...) 
{ 
    myCon(sapply(list(...), `[[`, 'charPart'), sapply(list(...), `[[`, 'numPart')) 
} 


> myObj1 
$charPart 
[1] "a" 

$numPart 
[1] 1 

attr(,"class") 
[1] "myClass" 
> myObj2 
$charPart 
[1] "b" 

$numPart 
[1] 2 

attr(,"class") 
[1] "myClass" 

這然後給出:

> concat(myObj1, myObj2) 
$charPart 
[1] "a" "b" 

$numPart 
[1] 1 2 

attr(,"class") 
[1] "myClass" 

..這我相信是你想要什麼???

+0

哎呀!感謝您的調試。我想那就是我想要做的沒有錯。 – AdamO

+0

沒問題。關於你在做什麼......沒關係,只要你沒有設計大量的數據處理代碼,因爲R沒有被編譯,並且深度遞歸函數(例如斐波那契,質數查找器,牛頓方法)更好不用這種方式編程...否則罰款。 –