Присвоить элемент списку в R - PullRequest
2 голосов
/ 25 февраля 2020

Мы можем использовать функцию 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.

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Проще:

`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"
0 голосов
/ 25 февраля 2020

Использование зла разбора :

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"
0 голосов
/ 25 февраля 2020

Возможно, что-то подобное?

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"

Я бы очень осторожно использовал что-то подобное в пакете, поскольку это не идиоматизм c R. В общем, пользователи R ожидают, что функции не будут модифицировать существующие объекты, но возвращать новые.

Конечно, есть некоторые заметные исключения ...

...