Используя 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))
}
}