【问题标题】:How can I return the original names of objects in a list?如何返回列表中对象的原始名称?
【发布时间】:2020-07-14 12:38:10
【问题描述】:

我创建了一个先前生成的图和矩阵的命名列表,我想返回这些元素的原始名称。

mylist <- list(FirstPlot=myplot1, FirstMatrix=mymatrix1, SecondPlot=myplot2)

names(mylist) 返回 [1] "FirstPlot" "FirstMatrix" "SecondPlot"

但我想返回[1] "myplot1" "mymatrix1" "myplot2"

我觉得一定有一种简单的方法可以做到这一点,但我找不到。有什么建议吗?

【问题讨论】:

  • 在创建列表时,是否有反对按要求命名?
  • 当您命名列表中的对象时,您实际上是在替换原始对象名称。如果您打印 mylist,您将看到每个对象都以新名称开头。它原来的名字已经消失了。
  • @Wimpel 你的意思是mylist &lt;- list(myplot1=myplot1, ...?这本来是可能的,但我已经为列表中的元素命名了一个目的,现在我想要其他东西的原始名称。此外,我实际上并没有一口气创建列表:我在生成对象时添加并命名了对象,并且返回代码会很乏味。
  • @SteveM 那么有没有办法用一个无名列表来做到这一点,例如mylist2 &lt;- c(myplot1, mymatrix1, myplot2)?在这种情况下,names(list) 返回NULL。创建列表是否总是会丢失原始名称?
  • 你为什么需要这个很神秘。

标签: r


【解决方案1】:

如果您未更改list 的内容,也不是原件,您可以尝试通过地址查找原件。

df1 <- data.frame(1:5)
df2 <- data.frame(2:7)
df3 <- data.frame(8:11)

mylist <- list(FirstPlot=df1, FirstMatrix=df2, SecondPlot=df3)

x <- sapply(ls(), function(x) tracemem(get(x)))
y <- sapply(mylist, tracemem)
cbind(names(y), names(x)[match(y, x)])
#     [,1]          [,2] 
#[1,] "FirstPlot"   "df1"
#[2,] "FirstMatrix" "df2"
#[3,] "SecondPlot"  "df3"

【讨论】:

  • 从未想过这种方法,非常酷.. 有一天我会需要这个:)
  • 我觉得这是一种情况,最好从脚本(或历史)中提取这些信息。
  • 感谢@GKi。这对我不起作用——x &lt;- sapply(ls(), function(x) tracemem(get(x))) 给了Error in tracemem(get(x)) : argument must not be a function——但无论如何,如果这是唯一的方法,我想我是在叫错树,@Roland 是对的。我要吸取的教训是原始名称没有存储在列表中。
  • @ParAtEPt 也许x &lt;- sapply(ls(), function(x) if(is.function(x)) NA else tracemem(get(x))) 会起作用。是的,原始名称当前未存储在列表中。正如@Roland 已经写的那样,一种方法是使用您的脚本或历史记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多