【问题标题】:Assign element to list in R将元素分配给R中的列表
【发布时间】:2020-06-09 12:13:21
【问题描述】:

我们可以使用append 函数将元素添加到列表中。比如吹。

a_list <- list()
a_list <- append(a_list, "a")

但我想这样做。 append_new 不返回而是更改 a_list。

a_list <- list()
append_new(a_list, "a")

eval 函数可以使用它来执行此操作。

a_list <- list()
eval(parse(text="a_list[[1]]<-a"))
a_list

但是如果我想写函数add_element_to_list.

a_list <- list()
add_element_to_list(a_list, "a")
a_list  ##  same as list("a")

函数怎么写?这个功能类似于assign,但功能更强大。

post使用eval(parse(text=""))但不能写在自定义函数append_new中。

【问题讨论】:

  • 非常相关,Why doesn't assign to a list element work?。除了eval(parse()),它没有解决您的问题的方法,但您大概可以为eval(parse()) 编写一个包装器?
  • 这篇文章我已经看过了,但是不能帮我做自定义功能。

标签: r pointers methods eval assign


【解决方案1】:

更简单:

`append<-` <- function(x, value) {
  c(x, value)
}

x <- as.list(1:3)
y <- as.list(1:3)
append(x) <- y
append(x) <- "a"
print(x)

[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 1

[[5]]
[1] 2

[[6]]
[1] 3

[[7]]
[1] "a"

【讨论】:

  • 这不仅更简单,而且是 R 中最惯用的做法。我认为这是最好的答案。
【解决方案2】:

使用邪恶 解析

append_new <- function(x, y){
  eval(parse(text = paste0(x, "[ length(", x, ") + 1 ]<<- '", y, "'")))
}

a_list <- list()

append_new(x = "a_list", y = "a")

a_list
# [[1]]
# [1] "a"

append_new(x = "a_list", y = "b")

a_list
# [[1]]
# [1] "a"
# 
# [[2]]
# [1] "b"

【讨论】:

  • 是的,名副其实。我只是在想我可以用什么值来真正搞砸我的电脑!
【解决方案3】:

也许是这样的?

add_element_to_list <- function(this, that)
{
  if(typeof(this) != "list") stop("append_new requires a list as first argument")
  assign(deparse(substitute(this)), 
         append(this, that), 
         envir = parent.frame(),
         inherits = TRUE)
}

a_list <- list()

add_element_to_list(a_list, "a")

a_list 
#> [[1]]
#> [1] "a"

add_element_to_list(a_list, "b")

a_list 
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] "b"

我会非常谨慎地在包中使用这样的东西,因为它不是惯用的 R。通常,R 用户希望函数不要修改现有对象,而是返回新对象。

当然也有一些值得注意的例外......

【讨论】:

  • 是的,但是我发现python可以使用self.method来做很多事情。我可以帮助我减少 main 中的代码。所以我想尝试编写这种风格的 R 代码。但是R中没有自我概念。
猜你喜欢
  • 2023-03-16
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2013-02-08
  • 2019-08-31
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多