我之前写了一个函数expand.call(),它可以做你想要的事情(我认为...)。实际上,它可以做更多的事情:
expand.call <- function(definition=NULL,
call=sys.call(sys.parent(1)),
expand.dots = TRUE,
doEval=TRUE)
{
safeDeparse <- function(expr){
ret <- paste(deparse(expr), collapse="")
return(gsub("[[:space:]][[:space:]]+", " ", ret))
}
call <- .Internal(match.call(definition, call, expand.dots))
ans <- as.list(call)
if(doEval & length(ans) > 1) {
for(i in 2:length(ans)) ans[[i]] <- eval(ans[[i]])
}
frmls <- formals(safeDeparse(ans[[1]]))
frmls <- frmls[!sapply(frmls, is.symbol)]
add <- which(!(names(frmls) %in% names(ans)))
return(as.call(c(ans, frmls[add])))
}
如果您需要保留有关调用的更多信息或将其格式化得更好,通常会将此用作match.call()的替代方法:
foo <- function(x, bar="bar", gnurp=10, ...) {
call <- expand.call(...)
return(call)
}
> foo(2)
foo(x = 2, bar = "bar", gnurp = 10)
> xxx <- 2
> foo(xxx)
foo(x = 2, bar = "bar", gnurp = 10)
> foo(xxx, b="bbbb")
foo(x = 2, bar = "bbbb", gnurp = 10)
> foo(xxx, b="bbbb", doEval=FALSE)
foo(x = xxx, bar = "bbbb", doEval = FALSE, gnurp = 10)
也许您可以使用它来解决您的问题。
eval
。如果我可以提出建议:也许您可以考虑将该参数命名为doEval
,以免与函数eval
引起混淆。 - BenBarnes