2017-06-13 63 views
0

我想通過try和catch功能「重載」一個函數。使用點功能方法

這是一個「低層次的例子」,但如果我解決這個問題,我有一個解決方案。

write.csv2 <- function(...) { 
    utils::write.csv2(x = ..1,paste0("GET.THE.NAME.OF.THE.X_arg",".csv")) 
} 

write.csv2(x=mtcars) 

被稱爲「mtcars.csv」

如果我打電話write.csv上述函數調用應該在CSV文件最終的結果(X = DATAdata)應該有一個CSV所謂DATAdata.csv

我想:

deparse(替代())和其他的東西。沒有什麼工作到很遠。

編輯:

爲什麼它不起作用?

write.csv2 <- function(...) { 
    utils::write.csv2(x = ..1,file = paste0(deparse(substitute(..1)),".csv")) 
} 
write.csv2(x=mtcars) 
+0

你爲什麼試圖只使用一個網點列表?如果直接使用命名參數,執行deparse/repla魔術會容易得多。 – Dason

回答

1

一般來說,我轉換...來命名列表:

fun1 <- function(...){ 

argv <- list(...) 

return(argv) 

} 

這意味着您可以從列表中的名稱引用您的變量,你給他們在函數調用:

> fun1(filename='mtcars.csv') 
$filename 
[1] "mtcars.csv" 

或更復雜一些:

fun2 <- function(...){ 

argv <- list(..) 

write.csv(argv$x,argv$filename) 

} 

隨時致電fun2(x=runif(100),filename='randomnumbers.csv')

1

這樣的事情如何?

write.csv2 <- function(...) { 
    call <- match.call(utils::write.csv2) 
    call[[1]] <- utils::write.csv2 
    call$file = paste0(deparse(call[[2]]), ".csv") 
    eval.parent(call) 
} 
write.csv2(mtcars) 

這裏我們捕獲撥打電話,重新寫file=參數並將其傳遞到真正的功能。

+0

我認爲這可以讓我在某個地方。這太理解atm了 –