Как присвоить значения объекту, не вводя непосредственно объект в R? - PullRequest
1 голос
/ 26 марта 2020

Допустим, я создаю список с помощью функции assign:

name <- "test_list"
assign(name, list(a = c(1,2), b = c(3,4)))

Теперь, скажем, я хочу присвоить новое значение для test_list, не вводя его напрямую (как в ситуации где я хочу, чтобы объекты с указанными c именами создавались автоматически).

Обе следующие попытки не сработали:

1.)

as.name(name)$a[[1]] <- 5

2.)

eval(expr = as.name(name))$a[[1]] <- 5

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Мы можем использовать

assign(name, `[<-`(get(name),  get(name)$a[1], 5))

Или сделать это более явным

assign(name, {dat <- get(name); dat$a[1] <- 5; dat})

Или извлечь объект из globalenv и назначить

.GlobalEnv[[name]]$a[1] <- 5
test_list
#$a
#[1] 5 2

#$b
#[1] 3 4
1 голос
/ 26 марта 2020

Один подход - с eval(parse(text=expression)), который часто может быть задействован в чрезвычайной ситуации. Но я бы постарался избежать этого как можно больше.

name <- "test_list"
assign(name, list(a = c(1,2), b = c(3,4)))
eval(parse(text=paste0(name,"$a[[1]] <- 5")))
test_list
$a
[1] 5 2

$b
[1] 3 4
...