2017-06-13 68 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了 –