如何在不直接在 R 中输入对象的情况下为对象赋值?
How to assign values to an object without directly typing out the object in R?
假设我使用 assign
函数创建了一个列表:
name <- "test_list"
assign(name, list(a = c(1,2), b = c(3,4)))
现在,假设我想为 test_list
分配一个新值而不直接输入它(就像在我希望自动生成具有特定名称的对象的情况下)。
以下两种尝试均无效:
1.)
as.name(name)$a[[1]] <- 5
2.)
eval(expr = as.name(name))$a[[1]] <- 5
有什么想法吗?
我们可以使用
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
一种方法是 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
假设我使用 assign
函数创建了一个列表:
name <- "test_list"
assign(name, list(a = c(1,2), b = c(3,4)))
现在,假设我想为 test_list
分配一个新值而不直接输入它(就像在我希望自动生成具有特定名称的对象的情况下)。
以下两种尝试均无效:
1.)
as.name(name)$a[[1]] <- 5
2.)
eval(expr = as.name(name))$a[[1]] <- 5
有什么想法吗?
我们可以使用
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
一种方法是 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