之前的Using R, how to reference variable variables (or variables variable) a la PHP [帖子]
我问了一个关于R $ analagous到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
的默认输出使用dcolumns居中,我不喜欢(我更喜欢r@{}l
,所以我想写自己的我编写这个代码的目的是让我编写可以反复使用的可扩展代码。我可以在几秒钟内重建我的24个表,所以如果数据发生变化,或者我想调整这个函数,我马上得到了一个很好的答案。抽象的力量。
当我攻击这个时,我希望得到的不仅仅是观察数量,还有群组数量,可以是任何用户定义的索引。就我而言,它是&#34;国家&#34; (等待它,因此需要变量变量)。
如果我查找结构,我想要的就是那里: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,我可以键入一个字符串并进行评估。为什么不能直接访问内部函数,然后捕获的元素会被打印到屏幕上?
答案 0 :(得分:0)
R
中没有等效功能。 get()
适用于所有类型,而不仅仅是strings
。
答案 1 :(得分:0)
在与R-bug小组聊天之后,我想出了这些内容,并从中获得了一些想法。 KUDOS!
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);
下面是一些示例用例,我可以直接访问str(obj)提供的内容...扩展&#39; $&#39;的实用程序。运营商也允许&#39; @&#39;对于属性。
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);
}
}
git status --ignore-submodules=none