将元素动态添加到列表而不是直接调用列表名称

huangapple go评论94阅读模式
英文:

Add element to a list dynamically instead of invoking the list name directly

问题

我已经使用这段代码创建了一个列表:

  1. i=1
  2. assign(paste0("dat",i,"_list"),list()) #创建一个名为dat1_list的空列表

我想要将一个数据框添加到该列表中,可以像这样做:

  1. dat1_list[[1]]<-iris

然而,我不想直接硬编码列表的实际名称(就像上面的代码行中那样),而是需要动态使用其名称的组成部分("dat",i的当前值,"_list")。

我已经尝试使用paste0(),就像我创建列表时所做的那样(代码的第二行),但我无法使其正常工作。

谢谢您的时间、关注和建议!Mark

英文:

I have created a list using this code:

  1. i=1
  2. assign(paste0(&quot;dat&quot;,i,&quot;_list&quot;),list()) #creates empty list called dat1_list

and I would like to add a dataframe to that list, which I can do like this:

  1. dat1_list[[1]]&lt;-iris

HOWEVER I don't want to call the list directly by hard coding its actual name (as in the line immediately above) but instead I need to use the constituents of its name ("dat", current value of i, "_list") dynamically.

I have tried using paste0() like I did to create the list (second line of code, above), but I can't make it work.

Thank you for your time, attention and advice! Mark

答案1

得分: 2

  1. 你可以这样做但我认为这是一个糟糕的主意 - 这段代码很难编写和阅读
  2. ```R
  3. i=1
  4. obj_name = paste0("dat",i,"_list")
  5. ## 初始化空列表
  6. assign(obj_name,list())
  7. ## 验证
  8. dat1_list
  9. # list()
  10. ## 给列表的第一个项目分配一个值
  11. assign(obj_name, `[[<-`(get(obj_name), i = 1, value = iris[1:3, ]))
  12. ## 验证
  13. dat1_list
  14. # [[1]]
  15. # Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  16. # 1 5.1 3.5 1.4 0.2 setosa
  17. # 2 4.9 3.0 1.4 0.2 setosa
  18. # 3 4.7 3.2 1.3 0.2 setosa
  19. ## 扩展
  20. assign(obj_name, `[[<-`(get(obj_name), i = 2, value = 3:5))
  21. ## 验证
  22. # [[1]]
  23. # Sepal.Length Sepal.Width Petal.Length Petal.Width Species
  24. # 1 5.1 3.5 1.4 0.2 setosa
  25. # 2 4.9 3.0 1.4 0.2 setosa
  26. # 3 4.7 3.2 1.3 0.2 setosa
  27. #
  28. # [[2]]
  29. # [1] 3 4 5

也许你最好使用一个列表的列表?

  1. <details>
  2. <summary>英文:</summary>
  3. You can do it like this but I think it&#39;s a terrible idea - this code is hard to write and hard to read.

i=1
obj_name = paste0("dat",i,"_list")

initialize the empty list

assign(obj_name,list())

verify

dat1_list

list()

assign a value to the 1st item of the list

assign(obj_name, [[&lt;-(get(obj_name), i = 1, value = iris[1:3, ]))

verify

dat1_list

[[1]]

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

extend

assign(obj_name, [[&lt;-(get(obj_name), i = 2, value = 3:5))

verify

[[1]]

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

[[2]]

[1] 3 4 5

  1. Perhaps you&#39;d be better using a list of lists?
  2. </details>

huangapple
  • 本文由 发表于 2023年3月10日 00:29:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75687447.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定