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调用程序其他位置的变量啦。