如何让Vectorize无形地返回结果?

时间:2015-02-16 18:27:53

标签: r vectorization

我有一个不应该返回任何输出的绘图函数f

f <- function(a=0) invisible(NULL)
f(10)

向量化f后,它会返回NULL

f_vec <- Vectorize(f)
f_vec(10)
[[1]]
NULL

如何防止这种情况,即在此输出也不可见。 我当然可以使用包装器来抑制它。

f_wrapper <- function(a=0) {
  dummy <- f_vec(a)
}
f_wrapper(10)

有没有办法避免包装并立即得到我想要的东西?

1 个答案:

答案 0 :(得分:4)

是的,有。这个新版本的Vectorize会执行此操作:

Vectorize_2 <- function (FUN, vectorize.args = arg.names, SIMPLIFY = TRUE, USE.NAMES = TRUE) {
  arg.names <- as.list(formals(FUN))
  arg.names[["..."]] <- NULL
  arg.names <- names(arg.names)
  vectorize.args <- as.character(vectorize.args)
  if (!length(vectorize.args)) 
    return(FUN)
  if (!all(vectorize.args %in% arg.names)) 
    stop("must specify names of formal arguments for 'vectorize'")
  FUNV <- function() {
    args <- lapply(as.list(match.call())[-1L], eval, parent.frame())
    names <- if (is.null(names(args))) 
      character(length(args))
    else names(args)
    dovec <- names %in% vectorize.args
    invisible(do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]), 
                                  SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES)))
  }
  formals(FUNV) <- formals(FUN)
  FUNV
}

但是,我怎么知道这样做的?我花了20分钟写了Vectorize的全新版本吗?不!我刚刚运行dput(Vectorize)以查看R后面的Vectorize代码,并在必要时添加了invisible!您可以使用所有R函数执行此操作。你甚至不需要dput!只需运行Vectorize