r - 无法理解 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
输出显示对象Fun1
、Fun2
和Fun3
在作业环境中定义。为什么运行时找不到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 的 Run as Local Job 进行测试。您还可以通过在新的空环境中运行来复制该行为。一个精简的例子是。
evalq({
Fun1 <- function(x) x^2
Funs <- "Fun1"
print('All Funs')
# print(lapply(Funs, get))
print(mget(Funs))
}, new.env())
推荐阅读
- php - cakephp 3 将多个文件下载为 zip 文件
- java - 如何在 Controller 中管理混合的多部分文件。我想在spring控制器的一个方法中处理@RequestParam和@RequestBody
- android - RecyclerView 下拉刷新
- ios - 在 Swift 中将数组转换为 Alamofire 参数
- html - 在 laravel 中处理前端大型项目
- javascript - JavaScript/Html - 在 8 个小数位后更改字体大小/颜色
- c# - 大型文件批次的文件完整性检查
- python - 无法在 WHERE IN SQL 子句中获取 python 元组作为输入?
- javascript - 如何使数据可用于表中的所有行
- sql - 仅在单个列上聚合函数?