【问题标题】:How to avoid promise already under evaluation warning for setting default argument as a function of another argument如何避免承诺已经在评估警告下将默认参数设置为另一个参数的函数
【发布时间】:2017-07-25 21:58:41
【问题描述】:

我已阅读与“承诺已在评估中”警告相关的问题的其他答案,但我无法了解它们如何帮助我避免此问题。

这里我有一个函数,对于一个方法,它采用一个默认参数值,该值是另一个值的函数。

myfun <- function(x, ones = NULL) {
    UseMethod("myfun")
}


myfun.list <- function(x, ones = NA) {
    data.frame(x = x[[1]], ones)
}

ones <- function(x) {
    rep(1, length(x))
}

到目前为止,一切都很好:

myfun(list(letters[1:5]))
##   x ones
## 1 a   NA
## 2 b   NA
## 3 c   NA
## 4 d   NA
## 5 e   NA

但是当我定义另一个将ones 参数的默认值设置为函数ones(x) 的方法时,我得到一个错误:

myfun.character <- function(x, ones = ones(x)) {
    myfun(as.list(x), ones)
}

myfun(letters[1:5])
## Error in data.frame(x = x[[1]], ones) : 
##  promise already under evaluation: recursive default argument reference or earlier problems? 

由于各种原因,我需要保持参数名称与函数名称相同(对于ones)。 如何强制评估 my fun.character 中的参数?我还需要它来工作(它确实如此):

myfun(letters[1:5], 1:5)
##   x ones
## 1 a    1
## 2 a    2
## 3 a    3
## 4 a    4
## 5 a    5

谢谢!

【问题讨论】:

    标签: r parameter-passing lazy-evaluation


    【解决方案1】:

    需要深入研究 R(臭名昭著的)环境才能准确了解它试图找到 ones 的位置。问题在于提供的方式和在函数内评估默认参数的方式。您可以从 R 手册中查看 this 链接,以及 here 的说明。

    简单的解决方案是告诉 R 在哪里寻找它。它将为您省去麻烦。在你的情况下,这就是全球环境。

    更改方法myfun.character 告诉它在全局环境中寻找ones

    myfun.character <- function(x, ones = get('ones', envir = globalenv())(x)) {
    
      myfun(as.list(x), ones)
    
    }
    

    到这里就够了。

    输出:

    myfun(letters[1:5])
    #  x ones
    #1 a    1
    #2 a    1
    #3 a    1
    #4 a    1
    #5 a    1
    
    myfun(letters[1:5], 1:5)
    #  x ones
    #1 a    1
    #2 a    2
    #3 a    3
    #4 a    4
    #5 a    5
    

    【讨论】:

    • 这为我指明了一个解决方案:对于此示例代表问题的包,在 myfun.character 函数签名中使用 package::ones(x) 的等效项。谢谢!然而,为了缩短它,有没有办法使用问题中的原始函数签名强制评估 myfun.character 中的 package::ones(x)?
    • using :: 会将 R 指向包的命名空间环境,因此您实际上是在告诉 R 在哪里查找函数。使用:: 是正确的方法,我认为在这种情况下没有办法缩短它。
    猜你喜欢
    • 2011-05-20
    • 2017-02-03
    • 2018-01-22
    • 1970-01-01
    • 2014-01-03
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多