我希望通过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)
答案 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=
参数并将其传递给实际函数。