kjo*_*kjo 9 environment scope r
我认为使用完全限定的名称来避免使用我没有明确介绍的名称来污染我的范围就足够了,但显然,对于R,情况并非如此.
例如,
% R_PROFILE_USER= /usr/bin/R --quiet --no-save --no-restore
> ls(all = TRUE)
character(0)
> load("/home/berriz/_/projects/fda/deseq/.R/data_for_deseq.RData")
> ls(all = TRUE)
[1] "a" "b" "c"
> ?rlog
No documentation for ‘rlog’ in specified packages and libraries:
you could try ‘??rlog’
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.特别是,正如最后一个命令所示,解释器一无所知rlog
.
但是在我跑完之后
> d <- DESeq2::DESeqDataSetFromMatrix(countData = a, colData = b, design = c)
Run Code Online (Sandbox Code Playgroud)
...然后,此后,该命令?rlog
将为我未明确引入环境的函数生成文档页面(并未使用完全限定名称引用).
我觉得这种行为令人不安.
特别是,我不知道我明确提出的某些定义何时会被默默地视为一些看似无关的命令的副作用.
如何控制环境可以看到的内容?
或者换句话说,如何防止上面所示的副作用?
不确定“范围”在 R 中的含义是否与其他语言中的含义相同。R 使用“环境”(详细说明请参见http://adv-r.had.co.nz/Environments.html)。R 中的范围包括加载的所有环境,并且正如您所发现的,用户不会显式控制加载的每个环境。
例如,
ls()
Run Code Online (Sandbox Code Playgroud)
列出默认环境“.GlobalEnv”中的对象
search()
Run Code Online (Sandbox Code Playgroud)
列出当前加载的环境。
ls(name='package.stats')
Run Code Online (Sandbox Code Playgroud)
在默认的 R 安装中,“package:stats”是启动时加载的环境之一。
默认情况下,您创建的所有内容都存储在全局环境中。
ls(name='.GlobalEnv')
Run Code Online (Sandbox Code Playgroud)
您可以通过使用 $ 语法引用其环境来显式引用您创建的对象。
x <- c(1,2,3)
.GlobalEnv$x
Run Code Online (Sandbox Code Playgroud)