Используя R, как ссылаться на переменные (или переменные) а-ля PHP

Используя 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 я могу назначить $a="hello"; а также $hello="hello world";, Я могу тогда использовать eval динамически изменять переменные; это называется переменной переменной в php, используя два знака доллара ($$): echo($$a); напечатает "привет мир". Он оценивает $a, который является hello, затем оценивает $hello.

Итак, у меня есть настройка регрессии с использованием R, с 4 опциями данных и 3 опциями модели. Я выполняю около 60 строк статистики, используя R и в основном библиотеку plm, но также tseries, lmtest (набор диагностических тестов, объединенные OLS, фиксированные эффекты (FE) и случайные эффекты (RE) с тестами на гетероскедастичность, последовательную автокорреляцию перекрестная зависимость автокорреляции и т. д. Если эти элементы существуют, я корректно обновляю стандартные ошибки в зависимости от того, что присутствует: только гетеро [vcovHC white], гетеро-последовательный или гетерокросс [vcovHC arellano], все [vcovSCC Driscoll-Kraay].

В конце я хочу отобразить скорректированные модели регрессии FE/RE для 3-х опций модели на странице. Каждая страница будет иметь один из четырех вариантов данных. Я хочу вывести это в латексе. Так что в этом сценарии мне нужен подход переменных переменных. я стараюсь eval(, parse(, substitute(, assign(,

так что посмотрим, у меня есть переменная в R mDat.total который содержит данные, которые мне нужны для регрессии. у меня тоже есть mDat.hi, mDat.mid, mDat.low, Эти 4 элемента я могу представить в виде списка строк, указывающих на переменную:

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

Точно так же для моделей у меня есть типы данных формул (используя формулу, Формула, pForumla, такие как model.main = emp~wage+capital|lag(wage,1)+capital:

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

Я хочу перебрать i в d, j в m и выполнить несколько регрессий.

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)

За i=1;j=1 myData оценивается как mDat.total dataframe, и myModel оценивается как model.main

В идеале мне нужна отдельная функция, использующая R, которая ведет себя как $$ (например, в приведенном выше псевдокоде замените $$ на функцию doubleEvaluate(x) или VariableVariable(x).

Заранее спасибо.

монте

{Икс:

1 ответ

Решение

Попробуйте использовать 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))    
  }  
}
Другие вопросы по тегам