且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用R,如何在PHP中引用变量变量(或变量变量)

更新时间:2022-10-22 21:43:12

考虑使用 get()从字符串值获取环境变量.此外,请考虑在数据框和模型列表之间嵌套的lapply(),以获得更有条理的返回对象.嵌套的for循环将需要将每个迭代附加到增长列表中,除非您只需要输出.以下示例使用线性模型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)

带有嵌套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))    
  }  
}

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:

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))    
  }  
}