douxie2023 2016-01-30 20:15
浏览 215
已采纳

使用R,如何引用变量变量(或变量变量)一个PHP

Using R stats, I want to access a variable variable scenario similar to PHP double-dollar-sign technique: http://php.net/manual/en/language.variables.variable.php

Specifically, I am looking for a function in R that is equivalent to $$ in PHP.


UPDATE: The approved answer contains the basic function needed
##################################
    hello="hello world";
    a="hello";
    result=get(a);
    print(result);
##################################

In PHP, I can assign $a="hello"; and $hello="hello world";. I can then use an eval to dynamic change variables; this is called a variables variable in php, using two dollar signs ($$): echo($$a); will print "hello world". It evaluate $a which is hello, then evaluates $hello.

So, I have a regression setup using R, with 4 data options and 3 model options. I perform about 60 lines of stats using R and mainly the library plm, but also tseries, lmtest (a bunch of diagnostic tests, a pooled OLS, fixed effects (FE), and random effects (RE) with tests for heteroskedasticity, serial autocorrelation, cross-dependence autocorrelation, and so on. If these elements exist, I smartly update the standard errors depending on what is present: only hetero [vcovHC white], hetero-serial or hetero-cross [vcovHC arellano], all [vcovSCC Driscoll-Kraay].

In the end, I want to display the adjusted regression models FE/RE for 3 model options on a page. Each page will have one of the four data options. I want to output this in Latex. So in this scenario, I need a variables variable approach. I am trying eval(, parse(, substitute(, assign(.

so consider I have a variable in R mDat.total that contains the data I need for a regression. I also have mDat.hi, mDat.mid, mDat.low. These 4 elements, I can represent as a list of strings pointing to the variable:

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

Similarly, for the models, I have formula datatypes (using formula,Formula,pForumla such as model.main = emp~wage+capital|lag(wage,1)+capital:

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

I want to loop over i in d, j in m, and perform a bunch of regressions.

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)

For i=1;j=1, myData evaluates to be the mDat.total dataframe, and myModel evaluates to be the model.main

Ideally, I want a standalone function using R that behaves like $$ (e.g., in above pseudo code, replace $$ with a function doubleEvaluate(x) or VariableVariable(x).

Thanks in advance.

monte

{x:

  • 写回答

1条回答 默认 最新

  • doujie2356 2016-01-31 03:02
    关注

    Consider using get() to obtain environment variables from string values. Additionally, consider the nested lapply() between dataframe and model lists for more organized returned object. Nested for loops would require appending each iteration into growing list unless you just need to output. Below examples use linear models, lm():

    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)
    

    Example with nested for loop:

    # 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))    
      }  
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?