首页 > 解决方案 > 无法理解 RStudio Jobs 的行为方式

问题描述

RStudio 中的本地作业功能没有像我预期的那样运行。

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

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 按钮运行脚本,它会完全按预期工作。

使用 Run Script as Local Job 功能(没有全局环境的副本)会导致以下输出和错误:

[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在作业环境中定义。为什么运行时找不到lapply

RStudio 版本 1.4.861

R 4.0.2

标签: rrstudio

解决方案


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

在这里使用的更好的功能是mget

print(mget(Funs))

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

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

或在外壳中捕获环境

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

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

您实际上不需要使用带有 RStudio 的 Run as Local Job 进行测试。您还可以通过在新的空环境中运行来复制该行为。一个精简的例子是。

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

推荐阅读