在原始值被覆盖后,如何 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
}
这将
- 计算结果,
- 打印诊断消息,
- 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"
我知道 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
}
这将
- 计算结果,
- 打印诊断消息,
- 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"