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
[参考]
1. http://cran.r-project.org/doc/manuals/r-release/R-intro.html#Lists-and-data-frames
时间: 2024-11-05 17:31:21