使用quantmod库访问R中的环境对象

使用quantmod库访问R中的环境对象,r,environment,quantmod,R,Environment,Quantmod,我在R方面有一些经验,但迄今为止从未使用过我自己的环境。在过去的几个月里,我不得不时不时地使用自己的环境,对此我有一些疑问 将环境用作“数据容器”的主要原因是 因为它比别人快得多,对吗?例如,使用 quantmod为什么我们要使用 getSymbols 从getSymbols产生这样一个新环境,即 tick = c( "VNO" , "VMC" , "WMT" , "WAG") data.env <- new.env() start<-as.Date("2013-01-0

我在R方面有一些经验,但迄今为止从未使用过我自己的环境。在过去的几个月里,我不得不时不时地使用自己的环境,对此我有一些疑问

  • 将环境用作“数据容器”的主要原因是 因为它比别人快得多,对吗?例如,使用
    quantmod
    为什么我们要使用
    getSymbols
getSymbols
产生这样一个新环境,即

tick = c( "VNO" , "VMC" , "WMT" , "WAG") 
data.env <- new.env()    start<-as.Date("2013-01-01")   
getSymbols(tick,env=data.env,src="yahoo",from=start)
tick=c(“VNO”、“VMC”、“WMT”、“WAG”)

data.env正如Roman所建议的,检查数据环境中的某个对象是否为OHLC对象的最简单方法是使用eapply,如下所示:

eapply(data.env,is.OHLC)
它返回数据环境中对象的列表以及逻辑值(如果该对象是否为OHLC对象)。如果希望看到更紧凑的表单,可以在表达式周围环绕
“str”
。例如,要查看当前数据环境中的哪些对象是OHLC对象,我可以执行以下操作:

> str(eapply(data,is.OHLC))
List of 9
 $ VXZlong        : logi TRUE
 $ prices         : logi FALSE
 $ XIVlong        : logi TRUE
 $ dates          : logi FALSE
 $ VXXlong        : logi TRUE
 $ weight         : logi FALSE
 $ ZIVlong        : logi TRUE
 $ symbolnames    : logi FALSE
 $ execution.price: logi FALSE
将环境用作“数据容器”的主要原因是 因为它比别人快得多,对吗

不,我认为主要的原因是保持干净,避免覆盖全局环境中的对象。(此外,要将所有“新”对象作为“捆绑包”而不是几个单独的对象。为此,也可以使用列表,但列表和环境之间的差异请参见下文。)通过调用getSymbols,将创建四个新对象:

"VMC" "VNO" "WAG" "WMT"
如果这些对象是在您的全局环境(也称为工作区)中创建的,则任何具有相同名称的预先存在的对象都将被覆盖。(当您使用
load
…例如,您的工作区中有
x
,并且还保存在名为“x.rda”的文件中。在
load(“x.rda”)
之后,您工作区中先前版本的
x
将丢失。)


环境与普通的R对象不同,因为可以有不同的名称指向同一个环境。例如,如果X是R中的任何一种对象,然后分配<代码> y,你可以使用<代码> EpIs<代码>来筛选该环境中的对象。@ RoalLuxTik问题是我不想把列表作为值。因此,环境网络就像C++中的引用席?我不真正了解C++中的引用。他们说,在R中,环境使用“按引用传递语义”——这在包
proto
以及引用类中以巧妙的方式使用(请参见
?referenceclass
> ls(data.env)
[1] "VMC" "VNO" "WAG" "WMT"
> yummy <- data.env
> yummy$x <- "bingo"
> ls(data.env)
[1] "VMC" "VNO" "WAG" "WMT" "x"  
> data.env$x
[1] "bingo"
> data.env$x <- "Florida"
> yummy$x
[1] "Florida"
> with(yummy, rm(x))
> ls(data.env)
[1] "VMC" "VNO" "WAG" "WMT"
unlist(eapply(data.env, is.OHLC))
getSymbols(tick,env=.GlobalEnv,src="yahoo",from=start)