在函数中使用dotsMethods

时间:2017-06-13 15:28:22

标签: r function functional-programming

我希望通过try and catch功能“重载”一个函数。

这是一个“低感的例子”,但如果我解决了这个问题,我就可以解决我的真正问题。

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

write.csv2(x=mtcars)

上述函数调用的结果最终应该是一个名为“mtcars.csv”的CSV文件

如果我调用write.csv(x = DATAdata),应该有一个名为DATAdata.csv的csv

我试过了:

deparse(substitute())和其他东西。没有什么可行的。

编辑:

为什么它不起作用?

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

2 个答案:

答案 0 :(得分: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 :(得分: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=参数并将其传递给实际函数。