2017-06-13 15 views
0

私は、機能を「オーバーロード」したいと思っています。dotsで作業する

これは「低感覚の例」ですが、これを解決すれば私の本当の問題の解決策が得られます。

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

write.csv2(x=mtcars) 

上記関数呼び出しの結果は、私がwrite.csvを呼び出す場合(X = DATAdata)CSVがあるはず「mtcars.csv」

呼ばれるCSVファイルで終わるべきです私が試したDATAdata.csv

呼ば:

逆パース(代替())や他のもの。遠くには何も働かなかった。

編集:

なぜ機能しませんか?

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

なぜドットリストを使用しようとしていますか?名前付きパラメータを直接使用すると、deparse/substitueマジックを実行する方がはるかに簡単です。 – Dason

答えて

1

一般的に、私は名前のリストに...を変換:

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

fun1 <- function(...){ 

argv <- list(...) 

return(argv) 

} 

これは、あなたが関数呼び出しでそれらを与える名前でリストから変数を参照できることを意味します

またはもう少し洗練された:

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を理解するにはあまりにも多くのことです –