【问题标题】:How to rewrite a function's default argument in R? [duplicate]如何在 R 中重写函数的默认参数? [复制]
【发布时间】:2013-12-21 02:05:04
【问题描述】:

例如:

paste (..., sep = " ", collapse = NULL)

如何重写此函数以确保每个调用默认都有sep = ""

也就是说,我如何更改我没有编写的函数的参数的默认值?

【问题讨论】:

  • 为什么不使用paste0,默认是sep = ""

标签: r function arguments definition redefinition


【解决方案1】:

像这样:

paste <- function(..., sep="", collapse=NULL) base::paste(...,sep=sep, collapse=collapse)

但是为此已经有一个函数paste0

如果使用基本命名空间调用 paste,它也不会使用默认版本。

【讨论】:

    【解决方案2】:

    这是使用formals 的另一种方式。

    paste.formals <- formals(paste)
    paste.formals$sep <- ''
    formals(paste, envir=.BaseNamespaceEnv) <- paste.formals
    paste
    # function (..., sep = "", collapse = NULL) 
    # .Internal(paste(list(...), sep, collapse))
    # <environment: namespace:base>
    

    【讨论】:

    • 我不明白,请解释你的答案。
    【解决方案3】:
    paste("a","b") ## "a b"
    library(Defaults)
    

    一个有效的例子:

    mean(c(1,3,NA))  ## NA
    setDefaults(mean.default,na.rm=TRUE)
    mean(c(1,3,NA))  ## 2
    

    但是paste() 有问题:

    setDefaults(paste,sep="")
    ## Error: evaluation nested too deeply:
    ##    infinite recursion / options(expressions=)?
    

    大概是因为paste() 本身在setDefaults() 中使用。

    你会遇到一些麻烦覆盖这个默认值 功能。如果你想给我们更多的上下文,在 cmets 或 对原始问题的编辑,我们可能会有更多的建议。

    更新Setting Function Defaults R on a Project Specific Basis 的一个 cmets 表明 paste() 的问题是一个错误,而不是内在的不可能......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多