body(f1)[[-6ren">
gpt4 book ai didi

r - 使用 call() 赋值

转载 作者:行者123 更新时间:2023-12-04 19:24:59 24 4
gpt4 key购买 nike

假设我想像这样操作函数体:

> f1 = function(a, b, d) {
+ stop("This is a template!")
+ result
+ }
> body(f1)[[2]] = call("<-", as.name("result"), lapply(letters[1:2], as.name))

这看起来不错...
> f1
function (a, b, d)
{
result <- list(a, b)
result
}

...但不起作用:
> f1(a = 123, b = 456, d = 999)
[[1]]
a

[[2]]
b

另一方面,当我这样做时:
> body(f1)[[2]] = call("<-", as.name("result"),
+ as.call(c(as.name("list"), lapply(letters[1:2], as.name))))

看起来都一样...
> f1
function (a, b, d)
{
result <- list(a, b)
result
}

...但它有效:
> f1(a = 123, b = 456, d = 999)
[[1]]
[1] 123

[[2]]
[1] 456

有人可以帮我把它分解成一些非常小的部分并解释这里到底发生了什么吗?

最佳答案

问题是deparse并不完美。顺便说一下,这与任务无关;当表达式在不同的上下文中使用时存在同样的问题,例如:

bquote(1 + .(lapply(letters[1:2], as.name)))

或者
bquote(sum(.(lapply(letters[1:2], as.name))))

无论哪种方式,您都在构建名称列表,但您没有构建对 list 的调用。在未计算的表达式中。但是(我猜是这样)R 解析器不知道如何处理表达式中的名称列表,因为这种情况不会发生在不是通过未赋值表达式构造的真实 R 代码中。

关于r - 使用 call() 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59831503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com