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

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

Я задал вопрос о чем-то в R, аналогичной функции PHP $$:

Используя R stats, я хочу получить доступ к сценарию переменной переменной, похожему на технику PHP с двойным знаком доллара: http://php.net/manual/en/language.variables.variable.php

В частности, я ищу функцию в R, которая эквивалентна $$ в PHP.

get( Ответ работает для строк (символов).

lapply это способ перебирать списки

Или я могу зациклить и получить значения …

for(name in names(vars))
{
val = vars[[name]];

Мне до сих пор не ответили на функцию $$ в R, хотя лабиринт решил, что мне нужно в данный момент.

`$$` <- function

это позволяет оценивать любой тип переменной. Это все еще вопрос.


ОБНОВЛЕНИЕ


> mlist = list('four'="score", 'seven'="years");
> str = 'mlist$four'
> mlist
$four
[1] "score"
$seven
[1] "years"
> str
[1] "mlist$four"> get(str)
Error in get(str) : object 'mlist$four' not found
> mlist$four
[1] "score"

Или как насчет атрибутов для объекта, таких как mobj@index



ОБНОВЛЕНИЯ № 2

Итак, давайте определим контекст по необходимости. Я взломал texreg пакет для создания настраиваемого латексного выхода из 24 моделей регрессии для исследовательской работы. я использую plm фиксированные эффекты и вывод по умолчанию texreg использует dcolumns для центрирования, что мне не нравится (я предпочитаю r@{}lпоэтому я хотел написать свой собственный шаблон. Цель для меня, чтобы написать это, — написать расширяемый код, который я мог бы использовать снова и снова. Я могу перестроить свои 24 таблицы на 4 страницах в считанные секунды, поэтому, если данные изменятся или я захочу настроить функцию, я сразу получу хороший ответ. Сила абстракции.

Когда я взломал это, я хотел получить больше, чем количество наблюдений, но также и количество групп, которое может быть любым определяемым пользователем индексом. В моем случае это «страна» (дождитесь ее, следовательно, нужны переменные переменные).

Если я сделаю поиск структуры, то я хочу прямо здесь: model$model@index$country что было бы неплохо просто назвать как $$('model$model@index$country'); где я могу легко построить строку, используя paste, Нет, это мой обходной путь.

getIndexCount = function(model,key="country")
{
myA = attr(summary(model)$model,"index");
for(i in 1:length(colnames(myA)))
{
if(colnames(myA)[i] == key) {idx = i; break;}
}
if(!is.na(idx))
{
length(unique(myA[,idx]));
} else {
FALSE;
}
}



ОБНОВЛЕНИЯ № 3

Используя R, в командной строке я могу ввести строку, и она будет оценена. Почему эта внутренняя функция не может быть доступна напрямую, а захваченный элемент выводится на экран?

-1

Решение

Там нет эквивалентной функции в R, get() работает для всех типов, не только strings,

0

Другие решения

Вот что я придумал после общения с группой R-bug и получения от них некоторых идей. KUDOS!

`$$` <- function(str)
{
E = unlist( strsplit(as.character(str),"[@]") );
k = length(E);
if(k==1)
{
eval(parse(text=str));
} else {
# k = 2
nstr = paste("attributes(",E[1],")",sep="");
nstr = paste(nstr,'$',E[2],sep="");

if(k>2) {
for(i in 3:k)
{
nstr = paste("attributes(",nstr,")",sep="");
nstr = paste(nstr,'$',E[i],sep="");
}
}
`$$`(nstr);
}
}

Ниже приведены несколько примеров использования, где я могу получить прямой доступ к тому, что предоставляет str (obj) … Расширение полезности оператора ‘$’, также позволяя ‘@’ для атрибутов.

model = list("four" = "score", "seven"="years");
str = 'model$four';
result = `$$`(str);
print(result);

matrix = matrix(rnorm(1000), ncol=25);
str='matrix[1:5,8:10]';
result = `$$`(str);
print(result);## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14);
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69);
group <- gl(2, 10, 20, labels = c("Ctl","Trt"));
weight <- c(ctl, trt);
lm.D9 <- lm(weight ~ group);
lm.D90 <- lm(weight ~ group - 1); # omitting intercept

myA = anova(lm.D9); myA; str(myA);

str = 'myA@heading';
result = `$$`(str);
print(result);myS = summary(lm.D90); myS; str(myS);str = 'myS$terms@factors';
result = `$$`(str);
print(result);

str = 'myS$terms@factors@dimnames';
result = `$$`(str);
print(result);

str = 'myS$terms@dataClasses@names';
result = `$$`(str);
print(result);

После того, как обратная галочка может быть немного утомительной, я решил обновить функцию, вызывая ее access

access <- function(str)
{
E = unlist( strsplit(as.character(str),"[@]") );
k = length(E);
if(k==1)
{
eval(parse(text=str));
} else {
# k = 2
nstr = paste("attributes(",E[1],")",sep="");
nstr = paste(nstr,'$',E[2],sep="");

if(k>2) {
for(i in 3:k)
{
nstr = paste("attributes(",nstr,")",sep="");
nstr = paste(nstr,'$',E[i],sep="");
}
}
access(nstr);
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector