在原始值被覆盖后,如何 return 一个函数的参数?

How can I return a function's argument after the original value has been overwritten?

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

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

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

注意:我不想要解决此示例的更好方法。该示例故意过度简化,以显示我真正想要的功能。

你可以试试:

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

add2(4)
[1] "4 added to 2 is 6"

在您的情况下,根本不需要覆盖 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. return计算结果。

这就是你想要的吗?

更直白地说,以下内容适用于少数个案例(但不是一般情况):

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您想要什么?

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"