使用get()访问r中的列表元素

时间:2012-02-26 00:48:08

标签: string r list loops

我正在尝试使用get()访问r中的list元素,但是收到错误。

example.list <- list()
example.list$attribute <- c("test")
get("example.list") # Works just fine
get("example.list$attribute") # breaks

get(“example.list $ attribute”)中的错误:   对象'example.list $ attribute'未找到

任何提示?我正在循环一个标识列表名称的字符串向量,这将非常有用。

4 个答案:

答案 0 :(得分:24)

以下是您可能正在寻找的咒语:

get("attribute", example.list)
# [1] "test"

或许,对于你的情况,这个:

get("attribute", eval(as.symbol("example.list")))
# [1] "test"

# Applied to your situation, as I understand it...

example.list2 <- example.list 
listNames <- c("example.list", "example.list2")
sapply(listNames, function(X) get("attribute", eval(as.symbol(X))))
# example.list example.list2 
#       "test"        "test" 

答案 1 :(得分:4)

为什么不简单:

example.list <- list(attribute="test")
listName <- "example.list"
get(listName)$attribute

# or, if both the list name and the element name are given as arguments:
elementName <- "attribute"
get(listName)[[elementName]]

答案 2 :(得分:2)

如果您的字符串不仅包含对象名称,例如像这里的运算符,您可以将它们作为表达式进行评估,如下所示:

> string <- "example.list$attribute"
> eval(parse(text = string))
[1] "test"

如果您的字符串都是“object $ attribute”类型,您也可以将它们解析为object / attribute,这样您仍然可以get该对象,然后使用[[提取属性:

> parsed <- unlist(strsplit(string, "\\$"))
> get(parsed[1])[[parsed[2]]]
[1] "test"

答案 3 :(得分:-2)

flodel的答案适用于我的应用程序,因此我将发布我在其上构建的内容,即使这是非常缺乏灵感的。您可以使用for循环访问每个列表元素,如下所示:

#==============  List with five elements of non-uniform length  ================#
example.list=
list(letters[1:5], letters[6:10], letters[11:15], letters[16:20], letters[21:26])
#===============================================================================#
#======  for loop that names and concatenates each consecutive element  ========#
derp=c();            for(i in 1:length(example.list))
{derp=append(derp,eval(parse(text=example.list[i])))}
derp #Not a particularly useful application here, but it proves the point.

我正在使用这样的代码来处理一个函数,该函数通过列名调用数据框中的某些列集。用户输入一个列表,其中的元素表示不同的列名称集(每个集合是属于一个度量的一组项目),以及包含所有这些列的大数据框架。 for循环将每个连续的列表元素应用为内部函数 * 的列名集,仅应用于大数据帧的当前命名的列集。然后,它为矩阵的每个循环填充一列,其中输出用于大数据帧的子集,该输出对应于与该循环的数字对应的列表元素中的名称。在for循环之后,函数以输出它生成的矩阵结束。

不确定你是否想要对你的列表元素做类似的事情,但我很高兴我接受了这个技巧。感谢所有人的想法!

“第二个例子”/有关应用于分级响应模型因子评分的切线信息

这是我上面描述的功能,以防万一有人想要在大批量中计算分级响应模型因子得分 * ...输出矩阵的每一列对应于列表的一个元素(即,具有由列表元素中的列名指定的序数指示符项的潜在特征),并且行对应于用作输入的数据帧的行。每行应该包含相互依赖的观察,如来自给定个体,在输出矩阵的同一行中的因子分数属于该观察个体。此外,我觉得我应该补充一点,如果给定列表元素中的所有项目都使用完全相同的李克特评级选项,则评分响应模型可能不如评分量表模型更适合因子评分(参见http://www.rasch.org/rmt/rmt143k.htm )。

'grmscores'=function(ColumnNameList,DataFrame)   {require(ltm) #(Rizopoulos,2006)
x = matrix ( NA , nrow = nrow ( DataFrame ), ncol = length ( ColumnNameList ))
for(i in 1:length(ColumnNameList)) #flodel's magic featured below!#
{x[,i]=factor.scores(grm(DataFrame[,    eval(parse(text=   ColumnNameList[i]))]),
resp.patterns=DataFrame[,eval(parse(text= ColumnNameList[i]))])$score.dat$z1}; x}

<强>参考

* Rizopoulos,D。(2006)。 ltm:用于潜变量建模和项目响应理论分析的R包,统计软件期刊,17 (5),1-25。网址:http://www.jstatsoft.org/v17/i05/