使用 R,如何引用变量变量(或变量变量)就像 PHP 一样

Using R, how to reference variable variables (or variables variable) a la PHP

提问人:mshaffer 提问时间:1/31/2016 最后编辑:mshaffer 更新时间:1/31/2016 访问量:2177

问:

使用 R stats,我想访问一个类似于 PHP 双美元符号技术的变量场景:http://php.net/manual/en/language.variables.variable.php

具体来说,我在 R 中寻找一个相当于 PHP 中 $$ 的函数。


更新:批准的答案包含所需的基本功能

##################################
    hello="hello world";
    a="hello";
    result=get(a);
    print(result);
##################################

在 PHP 中,我可以分配 和 .然后,我可以使用动态更改变量;这在 PHP 中称为变量变量,使用两个美元符号 ($$): 将打印“Hello World”。它评估$a哪个是你好,然后评估$hello。$a="hello";$hello="hello world";evalecho($$a);

因此,我有一个使用 R 的回归设置,有 4 个数据选项和 3 个模型选项。我使用 R 执行了大约 60 行统计,主要是库 plm,但也使用 tseries、lmtest(一堆诊断测试、合并 OLS、固定效应 (FE) 和随机效应 (RE),以及异方差性、序列自相关、交叉依赖自相关等测试。如果存在这些元素,我会根据存在的内容巧妙地更新标准误差:只有异质 [vcovHC 白色]、异质序列或异质杂交 [vcovHC arellano]、所有 [vcovSCC Driscoll-Kraay]。

最后,我想在一个页面上显示 3 个模型选项的调整后的回归模型 FE/RE。每个页面将具有四个数据选项之一。我想在 Latex 中输出它。因此,在这种情况下,我需要一种变量变量方法。我正在尝试 , , , .eval(parse(substitute(assign(

因此,假设我在 R 中有一个变量,其中包含回归所需的数据。我还有 , , .这 4 个元素,我可以表示为指向变量的字符串列表:mDat.totalmDat.himDat.midmDat.low

d = c("mDat.total","mDat.low","mDat.mid","mDat.hi"); # data loop

同样,对于模型,我有公式数据类型(使用 formula,Formula,pForumla,例如:model.main = emp~wage+capital|lag(wage,1)+capital

m = c("model.main","model.lone","model.interaction"); # model loop

我想在 d 中循环 i,在 m 中循环 j,并执行一堆回归。

for(i in 1:length(d))
    {
    myData = $$d[i];
    for j in 1:length(m))
        {
        myModel = $$m[j];
        ... ### do stuff with myData, myModel
            that has been assigned the values of myData (a data frame) 
            and myModel (a model specification)

对于 ,myData 的计算结果为 DataFrame,myModel 的计算结果为i=1;j=1mDat.totalmodel.main

理想情况下,我想要一个使用 R 的独立函数,其行为类似于 $$(例如,在上面的伪代码中,将 $$ 替换为函数 doubleEvaluate(x) 或 VariableVariable(x)。

提前致谢。

蒙特

{x:

PHP R 赋值 变量

评论


答:

3赞 Parfait 1/31/2016 #1

考虑使用 get() 从字符串值中获取环境变量。此外,请考虑嵌套在数据帧和模型列表之间,以获得更有条理的返回对象。嵌套循环需要将每次迭代追加到增长列表中,除非您只需要输出。以下示例使用线性模型:lapply()forlm()

model1 <- y ~ x1
model2 <- y ~ x2
model3 <- y ~ x3

dflist <- c("df1","df2","df3")
modelist <- c("model1", "model2", "model3")

# MODEL DATA RETURNS NESTED LIST OF 3 ELEMENTS 
# EACH WITH CORRESPONDING DATA METRICS (COEFF, RESIDUALS, ETC.)
modeldata <- lapply(dflist,
                    function(x) {                  
                    df<-get(x)       
                    lapply(modelist,
                           function(y) {
                           model <- get(y)
                           ols <- lm(model, df)                                          
                    })                  
               })

# BELOW CREATES MODEL SUMMARY LIST OF 3 ELEMENTS 
# FOR FIRST THREE MODELS USING FIRST DATASET
modelsummary <- lapply(modeldata[[1]], summary)

带有嵌套循环的示例:for

# INITIALIZE A LIST TO CONTAIN DATA
modeldata <- list()

for (i in dflist){  
  df<-get(i)
  for (j in modelist){    
    model <- get(j)

    # APPEND TO MODELDATA LIST
    # FINAL RETURN IS LARGE LIST OF ALL DATA MODELS
    modeldata <- c(modeldata, lm(model, df))    
  }  
}

评论

0赞 mshaffer 1/31/2016
很好的答案。是的,我同意 lapply 是一种正确的方法,但有时 lapply 的逻辑不如过程 for 循环那么有意义。但是,您可能对不断增长的列表是正确的。让我编写代码,看看它是否有效。我几乎可以肯定我可以让它工作,但是对于任何变量类型,是否有一种 $$ 方法可以与 R 一起使用?
0赞 mshaffer 1/31/2016
因此,在您的场景中,您只构建一个对象(例如 ols)。我需要执行多个调用,并存储在主列表中...我尝试用一堆调用替换您的行 <code>ols <- lm(model, df)</code>,并以列表语句 <code>list(unittest.1=unittest.1, unittest.2=unittest.2, bptest=bptest, viftest=viftest, pdwtest=pdwtest, pbgtest=pbgtest, pooled.reg=pooled.reg, pooled.sum=pooled.sum, pooled.xsd=pooled.xsd, pooled.coef=pooled.coef, fixed.reg=fixed.reg, ..., random.reg=random.reg, ..., hausmantest=hausmantest);</代码>
0赞 mshaffer 1/31/2016
在上面的列表方案中,它返回一个维度正确的对象,但所有值都是 FALSE。
0赞 mshaffer 1/31/2016
> str(modeldata) List of 4 $ :List of 3 ..$ : logi FALSE ..$ : logi FALSE ..$ : logi FALSE $ :列表 3 ..$ : logi FALSE ..$ : logi FALSE ..$ : logi FALSE $ :列表 3 ..$ : logi FALSE ..$ : logi FALSE ..$ : logi FALSE $ :列表 3 ..$ : logi FALSE ..$ : logi FALSE ..$ : logi FALSE
0赞 mshaffer 1/31/2016
我可能需要“引号”......<code>list(“unittest.1”=unittest.1, “unittest.2”=unittest.2, “bptest”=bptest, “viftest”=viftest, “pdwtest”=pdwtest, “pbgtest”=pbgtest, “pooled.reg”=pooled.reg, “pooled.sum”=pooled.sum, “pooled.xsd”=pooled.xsd, “pooled.coef”=pooled.coef, “fixed.reg”=fixed.reg, ..., “random.reg”=random.reg, ..., “hausmantest”=hausmantest);</代码>