gpt4 book ai didi

r - 在函数中调用print(ls.str())影响rep的行为

转载 作者:行者123 更新时间:2023-12-04 03:25:36 25 4
gpt4 key购买 nike

在空环境下开始新的R session 。编写一系列函数,并将其参数用作对times的调用中的rep()参数的值。

f <- function(n) {
rep("hello", times = n)
}
f(x)

一个人期望这会失败,实际上一个人会得到:
# Error in f(x) : object 'x' not found

稍微修改一下功能:
f2 <- function(n) {
ls.str()
rep("hello", times = n)
}

f2(x)

如预期的那样,它仍然会失败:
# Error in f2(x) : object 'x' not found

进行一些修改(以查看控制台中的环境):
f3 <- function(n) {
print(ls.str())
rep("hello", times = n)
}

f3(x)

我仍然希望失败,但是会得到:
## n : <missing>
## [1] "hello"

好像对 print()的调用使rep一样工作,就好像 times设置为1一样。

最佳答案

这不是答案,但是太长了,无法发表评论。一个最小的可复制示例是:

f3 <- function(n) {
try(get("n", environment(), inherits=FALSE))
rep("hello", times = n)
}
f3(x)
## Error in get("n", environment(), inherits = FALSE) : object 'x' not found
## [1] "hello"

以下是推测性内容,是基于对 do_rep的来源进行的松散检查而得出的。 get开始 promise 评估,但是在未找到“缺失”符号时,似乎使 promise 部分未被评估。 rep是原始语言,然后尝试对 n进行操作,而没有意识到它是部分评估的 promise ,并且从根本上隐含地得出了'n == 1'的假设。

同样,这表明 promise 处于一种奇怪的状态(必须使用 browser/ debug来查看它):
f3a <- function(n) {
try(get("n", environment(), inherits=FALSE))
browser()
rep("hello", times = n)
}
f3a(x)
## Error in get("n", environment(), inherits = FALSE) : object 'x' not found
## Called from: f3a(x)
# Browse[1]> (n)
## Error: object 'x' not found
## In addition: Warning message:
## restarting interrupted promise evaluation
## Browse[1]> c
## [1] "hello"

关于r - 在函数中调用print(ls.str())影响rep的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46280120/

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