gpt4 book ai didi

r - 对...()感到困惑?

转载 作者:行者123 更新时间:2023-12-03 06:54:17 27 4
gpt4 key购买 nike

another question , sapply(substitute(...()), as.character) 在函数内部使用来获取传递给函数的名称。 as.character 部分听起来不错,但是 ...() 到底是做什么的呢?

它不是替换之外的有效代码:

> test <- function(...) ...()
> test(T,F)
Error in test(T, F) : could not find function "..."

更多测试用例:

> test <- function(...) substitute(...())
> test(T,F)
[[1]]
T

[[2]]
F

> test <- function(...) substitute(...)
> test(T,F)
T

最佳答案

这里简要说明了 ...() 为何如此工作。稍后我将填写更多详细信息和引用资料,但这涉及到要点。

  1. 在对其任何组件执行替换之前,substitute() 首先解析 R 语句。

  2. ...() 解析为调用对象,而 ... 解析为名称对象。

  3. ... 是一个特殊对象,仅用于函数调用。因此,当在调用对象中找到 ... 时,实现替换的 C 代码会采取特殊措施来处理它。当 ... 作为符号出现时,不会采取类似的预防措施。 (相关代码在R_SRCDIR/src/main中的函数do_substitutesubstitutesubstituteList(特别是后两个)中/coerce.c。)

因此,...()中的()的作用是使语句被解析为调用(又名语言)对象,以便替换将返回点的完全扩展值。令人惊讶的是,即使 ... 位于 () 的外部,它也会被替换,但是: (a) 调用在内部存储为类似列表的对象(b) 相关的 C 代码似乎对该列表的第一个元素和后续元素没有区别。

<小时/>

旁注:为了检查 substitute 的行为或各种对象的类,我发现设置一个小沙箱很有用,如下所示:

f <- function(...) browser()
f(a = 4, 77, B = "char")
## Then play around within the browser
class(quote(...)) ## quote() parses without substituting
class(quote(...()))
substitute({...})
substitute(...(..., X, ...))
substitute(2 <- (makes * list(no - sense))(...))

关于r - 对...()感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12523548/

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