管理 R 搜索路径 (like postgresql search_path?)

R 的搜索路径是一个层级结构,例如我们可以使用search()查看当前的层级。
> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base" 

说明当前有9个层级,从1开始编号直到9,当然也可以直接使用名字。
例如我们可以使用ls()或objects()看看每个层级的对象:

> ls(1)
[1] "x"
> ls(.GlobalEnv)
[1] "x"
> objects(2)
  [1] "acf"                  "acf2AR"               "add.scope"           
  [4] "add1"                 "addmargins"           "aggregate"           
  [7] "aggregate.data.frame" "aggregate.ts"         "AIC"        
......

现在我们可以创建一个数据框,并使用attach()将数据框绑定到第二个层级,其他层级顺序往后排。
> x <- data.frame(a=1:10,b=100:109,c=101:110)
> x
    a   b   c
1   1 100 101
2   2 101 102
3   3 102 103
4   4 103 104
5   5 104 105
6   6 105 106
7   7 106 107
8   8 107 108
9   9 108 109
10 10 109 110
> attach(x)

现在多了一个搜索路径x
> search()
 [1] ".GlobalEnv"        "x"                 "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"

这个搜索路径的对象有哪些呢?
> ls(x)
[1] "a" "b" "c"
> ls(2)
[1] "a" "b" "c"

正好是数据框x的几个name,是的通过这种方法,可以直接使用数据框的对象,而不需要使用数据框来引用。
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> b
 [1] 100 101 102 103 104 105 106 107 108 109
> c
 [1] 101 102 103 104 105 106 107 108 109 110

这些数据是不会被改变的,例如:
> a <- b
> a
 [1] 100 101 102 103 104 105 106 107 108 109

你看到的这个a是创建在1号搜索路径的,而不是2号搜索路径。
> ls(1)
[1] "a" "x"

所以只要删掉1号搜索路径的a, 又可以查看2号搜索路径的a了。它是没有变化的。
> ls(2)
[1] "a" "b" "c"
> rm(a)
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> ls(1)
[1] "x"

解除数据框的绑定,
> detach(x)
> ls(x)
[1] "a" "b" "c"
> objects(x)
[1] "a" "b" "c"
> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base" 

解除绑定后,无法直接使用数据框中的对象。
> a
Error: object 'a' not found


[参考]
上一篇:如何处理IE首页被篡改的问题


下一篇:第五章:尺寸处理(4)