无法理解 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
输出显示对象 Fun1
、Fun2
和 Fun3
是在作业环境中定义的。为什么在 运行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())
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
输出显示对象 Fun1
、Fun2
和 Fun3
是在作业环境中定义的。为什么在 运行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())