为啥 R 中的 ls() 不显示全局变量?
Posted
技术标签:
【中文标题】为啥 R 中的 ls() 不显示全局变量?【英文标题】:Why does ls() in R not show global variables?为什么 R 中的 ls() 不显示全局变量? 【发布时间】:2012-09-11 23:26:18 【问题描述】:在下面的代码中,字母和字母是全局的,或者在全局搜索路径中并且可以通过另一个包访问(同样的事情!)
> 字母 [1] “A” “B” “C” “D” “E” “F” “G” “H” “I” “J” “K” “L” “M” “N” “O” “P " "Q" "R" "S" [20] “T” “U” “V” “W” “X” “Y” “Z” > 字母 [1] “a” “b” “c” “d” “e” “f” “g” “h” “i” “j” “k” “l” “m” “n” “o” “p " "q" "r" "s" [20] “t” “u” “v” “w” “x” “y” “z” > ls() 字符(0) >一个 ls() [1] “一” > rm(a) > ls() 字符(0) >
【问题讨论】:
哇,今天有很多 R 程序员。 :-) 请注意,它们不是全局的,只是从base
命名空间导出,因此可以从全局工作区访问。
@mda:正如其他人所说,它们不是“全局”变量。它们只是通过查看附加到搜索路径的对象/包找到的对象。它们的存储/查找方式与 R 存储/查找(非方法)函数相同。
@mda:我想你不明白。您至少会从浏览手册中受益。当您以交互方式使用 R 时,您没有命名空间。只有包有命名空间,它们只包含在其中创建的对象,或者您从其他命名空间导入的对象。
@mda:我不是在扯皮。您说您想了解 R 术语,所以我正在向您解释。命令行的作用域与编写包时的作用域不同。
【参考方案1】:
出于同样的原因,它没有列出所有附加包中的所有导出函数(来自?ls
):
默认情况下,使用调用 'ls' 或 'objects' 的环境。
指定包含LETTERS
的环境,ls
将打印它的名称。
# LETTERS is in there somewhere...
sapply(search(),ls)
【讨论】:
【参考方案2】:如果您阅读?LETTERS
,您会注意到这些是常量而不是数据对象。该页面还表明这些常量位于base
命名空间中。要列出它们,我们必须告诉 ls()
在该命名空间中查找:
> ls(name = "package:base", pattern = "LETTERS")
[1] "LETTERS"
> ls(name = "package:base", pattern = "letters")
[1] "letters"
【讨论】:
好领导! :-) 在 R 中可以找到类似 ?Extract 和 ?Constants .... 的页面很有趣。是否有所有***元手册页的列表(来自基本包)? (data
函数只是从包中加载数据集。)我将 R-Core 的功劳归功于让 ?Constants
在控制台线上工作。不久前,尽管帮助页面标题为“常量”,但该搜索不会成功。 ?Extract
一直有效。另一个很好用的元搜索是?Devices
。有人可能能够构建一个帮助页面标题列表,这些标题也不是函数名称,但它高于我的工资等级。【参考方案3】:
apropos("letters",where=TRUE)
9 9
"letters" "LETTERS"
表示它们在搜索列表中的第9位,即,
search()
[1] ".GlobalEnv" "package:stats" "package:graphics"
[4] "package:grDevices" "package:utils" "package:datasets"
[7] "package:methods" "Autoloads" "package:base"
base
包。
【讨论】:
【参考方案4】:如果您想查看特定模式的对象并记住正则表达式搜索模式,您可以使用apropos
进行探索。我有点担心我会找到多少,所以我首先检查了这项工作的长度,它只有 30 个。这是目前在我的工作区中找到的所有字符向量。请注意,“字母”和“字母”都出现了。
apropos(what="^", mode="character")
[1] ".Depends" ".Depends" ".Depends" ".Depends"
[5] ".Depends" ".Depends" ".Depends" ".Depends"
[9] ".Depends" ".Depends" ".Depends" ".Depends"
[13] ".Device" ".Firstlib_as_onLoad" ".knownS3Generics" ".Library"
[17] ".Library.site" ".S3PrimitiveGenerics" "blues9" "letters"
[21] "LETTERS" "month.abb" "month.name" "p.adjust.methods"
[25] "R.version.string" "sas.get.macro" "state.abb" "state.name"
[29] "tm"
如果您在新会话中执行此操作,您将不会获得那么多“.Depends”。许多其他内置插件确实出现在此处,但缺少“pi”,因为它不是字符模式。如果你在我的机器中寻找“pi”,它的位置是 25,这在你使用 search() 之前并不是很有意义:
> search()[as.numeric(names(apropos(what="^pi", mode="numeric",where=1)))]
[1] "package:base"
# Removing the numeric restriction
> search()[as.numeric(names(apropos(what="^pi",where=1)))]
[1] "package:base" "package:utils" "package:lubridate" "package:grDevices" "package:graphics"
[6] "package:graphics" "package:MASS" "package:MASS" "package:MASS" "package:base"
所以所有这些包都有一些以“pi”开头的对象(主要是函数)。数字位置会随着加载的包的数量而变化,因为最近加载的包数量越少,“base”的搜索位置就会越高。
【讨论】:
【参考方案5】:因为它们是内置数据对象。对普通变量进行普通赋值,你会看到它:
R> myLETTERS <- LETTERS
R> ls()
[1] "myLETTERS"
R>
跑步
R> data()
显示所有可用的数据集。请参阅help(data)
了解更多信息,例如如何在特定环境而不是全局环境中查找数据。
【讨论】:
那么如何列出内置函数? 哦,我刚刚补充了——data()
。
data() 不包括字母和字母。 :(
Do help(letters)
-- 它不是 一个数据集,而是一个常数,所以我认为 data()
不适用。以上是关于为啥 R 中的 ls() 不显示全局变量?的主要内容,如果未能解决你的问题,请参考以下文章