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

报告相同问题?

悬赏问题

  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了
  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成
  • ¥15 HC32L176调试了一个通过TIMER5+DMA驱动WS2812B
  • ¥15 cocos的js代码调用wx.createUseInfoButton问题!