r - 采购时 RStudio 中的环境
问题描述
我发现查找源自 RStudio 的脚本的 WD 的常用方法是“dirname(parent.frame(2)$ofile)”。我试图研究这个的含义,阅读了很多关于环境的解释,但我仍然没有更接近理解这个命令。我运行了这个脚本:
print(environment())
print(parent.frame(1))
print(parent.frame(2))
print(parent.frame(3))
print(parent.frame(4))
f <- function() {
print('Do:')
print(environment())
print(parent.frame(1))
print(parent.frame(2))
print(parent.frame(3))
print(parent.frame(4))
}
f()
print("Parent 1:")
print(ls(parent.frame(1)))
print("Parent 2:")
print(ls(parent.frame(2)))
print(identical(environment(),parent.frame(1)))
print(identical(environment(),parent.frame(2)))
print(identical(environment(),parent.frame(3)))
print(identical(environment(),parent.frame(4)))
我得到了输出:
<environment: R_GlobalEnv>
<environment: 0x111987ab0>
<environment: 0x107fef700>
<environment: R_GlobalEnv>
<environment: R_GlobalEnv>
[1] "Do:"
<environment: 0x1119957d8>
<environment: R_GlobalEnv>
<environment: 0x111995998>
<environment: 0x107fef700>
<environment: R_GlobalEnv>
[1] "Parent 1:"
[1] "enclos" "envir" "expr"
[1] "Parent 2:"
[1] "chdir" "continue.echo" "curr.fun" "deparseCtrl"
[5] "echo" "ei" "enc" "encoding"
[9] "envir" "exprs" "file" "filename"
[13] "from_file" "have_encoding" "i" "i.symbol"
[17] "keep.source" "lastshown" "lines" "loc"
[21] "local" "max.deparse.length" "Ne" "ofile"
[25] "print.eval" "prompt.echo" "skip.echo" "spaced"
[29] "srcfile" "srcrefs" "tail" "use_file"
[33] "verbose" "width.cutoff" "yy"
[1] FALSE
[1] FALSE
[1] TRUE
[1] TRUE
我不确定我是否理解输出。
1) 全球环境的父母 1 和 2 到底是什么?我在哪里可以阅读更多关于它们的属性,包括使用的 $ofile?
2) 为什么 parent.frame(1) in 不等同于函数内的 parent.frame(2)?它们不是相同的——Global Env 的父级吗?
3)当数字足够大时,为什么 parent.frame 开始返回全局环境?这只是函数的编写方式还是这个层次结构有一些逻辑?
解决方案
当你上去时parent.frame
,你可以看到调用你的函数的函数的环境。该source()
函数有很多代码可以使它工作。它不只是将命令转储到您的控制台中。基本上它正在运行类似
source <- function(...) {
...
eval(ei, envir)
...
}
whereei
是文件中的表达式之一。然后eval
看起来像这样
eval <- function (expr, envir , enclos = ) {
.Internal(eval(expr, envir, enclos))
}
因此,当您从在源文件中调用的函数中调用第parent.frame()
一个函数时,它将首先看到该eval()
调用。如果您看一下,formals(eval)
您会发现它具有您的第一个父级中的这三个变量。第二个父级列出了在source()
函数本身中创建的所有变量,包括ei
我们刚刚看到的变量。所以这些值在哪里
# parent.frame(4)
# parent.frame(3)
source <- function(...) {
# parent.frame(2)
eval(ei, envir)
}
eval <- function (expr, envir , enclos = ) {
# parent.frame(1)
.Internal(eval(expr, envir, enclos))
# ^^ your code
}
但是 R 中的变量解析不会在调用函数的环境中查找。相反,它使用词法作用域,因此它查看定义函数的位置(未调用)。如果你想获得那个环境,你可以parent.env(environment())
从函数内部调用。通过一个简单的函数,你应该得到全局环境。所以这真的意味着这parent.frame
只是一个不幸的名字,因为这不是“真的”它是什么。
推荐阅读
- firebase - AngularFire2:ERROR 错误:权限缺失或不足
- php - click a link to bring up modal
- python - 将数据附加到熊猫数据框中
- java - Java print to file from multiple methods with appending the text
- encryption - Hash Function to create unique hash for 70 million Strings with return type long
- web-scraping - X-Instagram-GIS 标头生成
- arrays - 如何从多维数组中将空值替换为“”
- python - 如何使用统计分析创建移动平均函数..?
- python - 如何使用 Keras model.fit 记录训练样本的 ID?
- javascript - Javascript动态数组键值对