【问题标题】:How can I return a function's argument after the original value has been overwritten?原始值被覆盖后如何返回函数的参数?
【发布时间】:2020-07-03 14:32:41
【问题描述】:

我知道 R 有一个简单的方法可以做到这一点,但我想不起来了。假设我有这个糟糕的代码:

add2<-function(n)
{
  n<-n+2
  return(paste(n,"added to 2 is",n))
}

显然,add2(4) 会返回一些愚蠢的东西,比如“6 加到 2 是 6”。我知道 R 有一种方法可以返回这个函数的原始参数,这会给我我想要的行为,即输出“4 添加到 2 是 6”。但它是什么?换句话说,什么函数应该替换我的返回值中的第一个 n?

注意:我不想要更好的方法来解决这个例子。该示例故意过度简化以显示我真正追求的功能。

【问题讨论】:

  • add2&lt;-function(n) { n2 &lt;-n+2 return(paste(n,"added to 2 is",n2)) } add2(10) ?
  • @user63230 这就是我最后的笔记试图排除的内容。我的记忆坚持认为 R 有一个特定的函数来调用参数。

标签: r arguments


【解决方案1】:

在您的情况下,根本不需要覆盖n。以下代码完全相同:

add2 <- function (n) {
  paste(n, "added to 2 is", n + 2)
}

而函数名称add2 具有误导性,因为它暗示函数的结果确实是n + 2,而不是一些关于该计算的消息。

更一般地说,您很少希望覆盖值。创建一个新变量来保存计算结果几乎总是更合适:

add2 <- function (n) {
  result <- n + 2
  message(paste(n, "added to 2 is", result))
  result
}

这会

  1. 计算结果,
  2. 打印诊断消息,
  3. 返回计算结果。

这就是你所追求的吗?

更确切地说,以下在少数种情况下有效(但不是一般情况下):

add2 <- function (n) {
    n <- n + 2
    paste(match.call()$n, "added to 2 is", n)
}

这就是失败的原因:

add2(1 + 2)
# [1] "+ added to 2 is 5" "1 added to 2 is 5" "2 added to 2 is 5"

……这是对match.call的滥用。

【讨论】:

  • match.call 可能是我所追求的。我必须检查一下为什么这是滥用行为。我的印象是这对于包来说是惯用的。
  • @J.Mini 我从来没有见过这种用法,而且我想不出有什么用处!而且,重要的是,如前所述,这并不总是有效。特别是,当传递给函数的参数不是简单的文字时,它将失败。如果参数有副作用,“固定”解决方案将失败,因为它会重新评估它。
【解决方案2】:

根据cmets中的讨论,match.call是你的追求吗?

add2<-function(n)
{
  x <- match.call()
  n<-n+2
  print(x)
  print(names(x))
  print(x$n)
  return(paste(n,"added to 2 is",n))
}
add2(4)
add2(n = 4)
[1] ""  "n"
[1] 4
[1] "6 added to 2 is 6"

【讨论】:

    【解决方案3】:

    你可以试试:

    add2<-function(n)
    {
      n1<-n+2
      return(paste(n,"added to 2 is",n1))
    }
    
    add2(4)
    [1] "4 added to 2 is 6"
    

    【讨论】:

    • 这就是我最后的笔记试图排除的内容。我的记忆坚持认为 R 有一个特定的函数来调用参数。
    • @J.Mini 它没有,而且(正如我的回答中所解释的)这样的功能在惯用的 R 中没有帮助。
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多