无法理解 RStudio Jobs 的行为方式

Trouble understanding how RStudio Jobs is behaving

RStudio 中的 Local Job 功能未按预期运行。

这是一个简单的可重现示例:

Fun1 <- function(x) x^2

Fun2 <- function(x) x^3

Fun3 <- function(x) x^4

Funs <- c('Fun1', 'Fun2', 'Fun3')

print(Fun1(2))
print(Fun2(Fun1(2)))
print(Fun3(Fun2(Fun1(2))))

print('Fun1')
print(get(Funs[1]))
print('Fun2')
print(get(Funs[2]))
print('Fun3')
print(get(Funs[3]))

print('All Funs')
print(lapply(Funs, get))

如果脚本是 运行 和 source('myscript.r') 或 RStudio 中的 Source 按钮,它将完全按预期工作。

使用 运行 脚本作为本地作业功能(没有全局环境的副本)导致此输出和错误:

[1] 4
[1] 64
[1] 16777216
[1] "Fun1"
function(x) x^2
<environment: 0x0000000004530b38>
[1] "Fun2"
function(x) x^3
<environment: 0x0000000004530b38>
[1] "Fun3"
function(x) x^4
<environment: 0x0000000004530b38>
[1] "All Funs"
Error in FUN(X[[i]], ...) : object 'Fun1' not found
Calls: sourceWithProgress -> eval -> eval -> print -> lapply -> FUN
Execution halted

输出显示对象 Fun1Fun2Fun3 是在作业环境中定义的。为什么在 运行ning lapply 时找不到它们?

RStudio 版本 1.4.861

R 4.0.2

那是因为 get() 不再寻找正确的环境,因为您正在绕过全局环境。而是使用

这里使用的更好的函数是mget

print(mget(Funs))

但是如果你想使用get,那么你要么需要通过环境,

print(lapply(Funs, get, envir=environment()))

或捕获围栏中的环境

print(lapply(Funs, function(x) get(x)))

因此您捕获作业所在的本地环境运行。

您真的不需要使用 运行 作为 RStudio 的本地作业来测试它。您还可以在新的空环境中仅通过 运行 复制行为。一个浓缩的例子是。

evalq({
  Fun1 <- function(x) x^2
  Funs <- "Fun1"
  
  print('All Funs')
  # print(lapply(Funs, get))
  print(mget(Funs))
}, new.env())