0

我想从外部数据文件初始化一些变量。一种方法是设置如下文件foo.csv

var1,var2,var3
value1,value2,value3

然后发出:

attach(read.csv('foo.csv'))

问题是,以这种方式var1, var2, var3没有显示出来,ls()而且最重要的rm(all=ls())是不再清理所有东西并且var1, var2, var3仍然存在。

由于新对象的默认位置是“2”,我可以通过以下方式删除此变量所在的工作区:

detach(pos=2)

或者干脆

detach()

因为pos=2也是默认的detach

但是 detach()“太”强大了,它可以删除默认加载的 R 对象。这意味着,如果附加许多数据集,重复删除它们detach可能会导致删除默认的 R 对象,您必须重新启动它。除了单一的简单性rm(all=ls())消失了。

一种解决方案是直接连接var1, var2, var3到全球环境。

你知道怎么做吗?

attach(read.csv('foo.csv'), pos=1)

发出警告(未来错误)。

attach(read.csv('foo.csv'), pos=-1)

似乎无效。

4

3 回答 3

1

attach使用and的命名变体detach

attach(read.csv(text='var1,var2,var3\nvalue1,value2,value3'),
       name = 'some_name')

detach('some_name')

这将防止错误。您显然会将这两个包装到函数中并以适当的方式自动生成名称(最简单的是通过单调递增的计数器)。

于 2013-10-13T22:41:59.620 回答
1

“更安全”attach呢?

attach<-function(x) {for(n in names(x)) assign(n,x[[n]],globalenv()); names(x)} 

“更安全”意味着您可以看到附加的变量,ls()并且最重要的是使用单个变量将其删除rm(list=ls())

灵感来自mrip

于 2013-10-15T00:15:00.387 回答
1

如果要将变量直接读取到全局环境中,可以这样做:

{
  foo<-read.csv('foo.csv')
  for(n in names(foo)) assign(n,foo[[n]],globalenv())
}

大括号将防止foo也被添加到全局环境中。如果你愿意,你也可以把它变成一个函数。

于 2013-10-14T00:14:46.843 回答