在以前的使用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);
}
}