attach命令可以实现代码简化的目的,用拗口的术语来说,就是“将数据框添加到R的搜索路径中”。

这貌似不容易理解,做一个小例子看看。

关于数据框的例子:

id <- c(1,2,3)

name <- c("Jack","Tom","Mark")

age <- c(22,30,27)

mydata <- data.frame(id,age,name)

mydata

id age name
1    1   22   Jack
2   2   30   Tom
3   3   27    Mark

这里呢,变量mydata里面包含的是一个表格,我若是想调用其中的数据该怎么办呢?

方法一:用“$”符号

如:

mydata$age

[1] 22 30 27

mydata$age[3]

[1] 27

这样就实现了对age部分的整体与单独调用

方法二:用attach()命令

attach(mydata)

The following objects are masked _by_ .GlobalEnv:age, id, name

age

[1] 22 30 27

age[3]

[1] 27

detach(mydata)

age(2)

错误: 没有"age"这个函数

上面灰色字部分是程序的自动提示。从上面的例子可以看出,当用了attach命令后,程序就定位到mydata数据框中,在这个数据框中存在age,id,name三个向量,这个时候直接就可以用age来进行调用。当使用了detach命令之后呢,上面的“定位”解除,再用age也就不好使了。

但是呢,这样做还可能出现另一个问题,那就是如果在程序的其他位置,已经有了与数据框相同的函数怎么办?

age <- c(1,2,3)

attach(mydata)

The following objects are masked _by_ .GlobalEnv:age, id, name

age

[1] 1 2 3

发现问题了,此时再用age调用的时候,程序会傻傻地找错地方,找到单独定义的向量而不是数据框中去了——这似乎说明了向量的优先权要强于数据框。

为了解决这个问题呢,可以用with函数

方法三:利用with()函数

with(mydata,{

age

})

[1] 22 30 27

这回就对了吧。with()函数适用于当同名变量出现多次,避免程序定位错误的情况;但with也有个弊端,就是只在括号内部有效,在with()的括号内外,信息是完全隔绝的,所以当然不能够用with调用程序其他位置的变量啦。