使用R,如何引用变量变量(或变量变量)就像PHP一样[重新访问]


Using R, how to reference variable variables (or variables variable) a la PHP [revisited]

在以前的使用R中,如何引用变量变量(或变量变量(a la PHP[post]

我问了一个关于 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 中的 $$ 函数,尽管 lapply 解决了我目前需要的问题。

`$$` <- 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的默认输出使用 dcolumn 居中,我不喜欢(我更喜欢r@{}l,所以我想编写自己的模板。 我编写代码的目的是编写可扩展的代码,我可以一次又一次地使用。 我可以在几秒钟内跨 4 页重建我的 24 个表格,所以如果数据发生变化,或者如果我想调整函数,我会立即得到一个很好的答案。 抽象的力量。

当我破解这个时,我想得到的不仅仅是观察的数量,还有组的数量,可以是任何用户定义的索引。 在我的例子中,它是"国家"(等待它,因此需要变量变量(。

如果我对结构进行查找,我想要的就在那里:model$model@index$country简单地调用 as $$('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,在命令行上,我可以键入一个字符串并对其进行评估。 为什么不能直接访问该内部函数,然后捕获的元素被打印到屏幕上?

R 中没有等效的函数。 get()适用于所有类型,而不仅仅是 strings .

这是我在与 R-bug 小组聊天并从他们那里得到一些想法后想到的。 荣誉!

`$$` <- 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);
                }
    }