【问题标题】:Make a list of many objects from a vector of object names [duplicate]从对象名称的向量中列出许多对象[重复]
【发布时间】:2018-02-08 08:52:26
【问题描述】:

TL;DR:我需要的是list() 的矢量化版本。

我正在尝试创建一个对象列表。我不知道会有多少对象,也不知道它们会叫什么,而且可能有很多。所以我不能手工列出清单。

但是,我知道在创建列表时所有对象都将存在于我的环境中,并且我知道我将拥有一个包含所有对象名称的字符向量。

(这些是可怕的三层 for 循环的输出,我试图避免使其变得更大。我可以创建一个空列表,然后在循环创建对象时为其分配对象,但我会不喜欢。)

我搜索了 Google 和 Stack Overflow,但找不到好的解决方案。在我看来,我需要的是list() 的矢量化版本:它将采用对象名称的向量,找到所有这些对象并将它们推入列表中。

list(obj1, obj2, obj3) # Not this. I don't want to name each element individually.

objectsVector <- c("obj1", "obj2", "obj3")
list_vectorised(elements = objectsVector) # I want this instead. 

namesVector <- c("anObject", "anotherObject", "yetAnotherObject")
list_vectorised(elements = objectsVector, names  = namesVector) # Or better still, this. 

【问题讨论】:

  • 我相信现有的帖子很好地回答了您的问题:stackoverflow.com/questions/22235809/… 我通常发现 rep(NA,x) 策略非常适合我的需求。还有一些公开的方法可以将现有列表转换为向量(请参阅:stackoverflow.com/questions/4390862/convert-a-vector-to-a-list)看起来您需要使用 apply 函数,或者编写自己的效率可能较低的函数(使用 rep() 和 for 循环,我认为这是天真的方法)
  • 谢谢!使用 mget 比 lapply-ing get 好得多。
  • 在链接的帖子中查看我的答案。它使用mgetls 中的模式参数来拉取名称与特定模式匹配的对象。链接的帖子询问了 data.frames,但所有答案都适用于任何类型的 R 对象。
  • 谢谢,lmo。该模式没有多大帮助,因为我的对象实际上并不称为 obj1 等,而是具有可能与我不想获取的对象名称相似的动态名称。但是mget很好。

标签: r


【解决方案1】:

您可以使用mget 从环境中获取对象并将它们放入列表中。

mget(VECTOR_OF_NAMES_OF_OBJECTS)

您还可以将mgetls() 结合使用,这样您就不必自己输入对象名称了。

obj1 = 1:2
obj2 = 3:7
obj13 = 8:11

mget(ls(pattern = "obj\\d+"))
#$obj1
#[1] 1 2

#$obj13
#[1]  8  9 10 11

#$obj2
#[1] 3 4 5 6 7

【讨论】:

  • 恐怕这不能解决我的问题。这些对象实际上不会被称为 obj1、ob2 等,而是具有动态名称。但我很高兴知道 mget 存在并且 ls() 可以采用正则表达式。 mget 比我的解决方案更好。谢谢!
【解决方案2】:

我找到了解决办法!

foo <- lapply(objectsVector, get) # This creates a list of the objects.
foo <- setnames(foo, namesVector) # This names the elements of the list. 

我把这个问题留了下来,因为我花了很长时间寻找答案,并希望免去其他人的麻烦。我不确定这是否是被批准的事情。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多