假设我有一个元素列表,我想更改其中一个元素,但不能通过名称直接调用列表(我只能将其构造为字符串)。
x_1 <- list()
for (i in 1 : 5) {
x_1[[i]] <- i
}
assign(eval(as.name(paste0("x_", 1)))[[1]], 6)
使用assign
- eval
- as.name
- paste
的这种长结构会出现错误:"first argument is wrong"
。
我该如何正确地做到这一点?为什么这个建筑不起作用?
答案 0 :(得分:4)
您可以使用<-
构建分配表达式然后使用eval(parse(text=x))
来完成此操作:
x_1 <- as.list(1:5)
eval(parse(text=paste0("x_1[[1]] <-", 123)))
x_1
##
## [[1]]
## [1] 123
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
##
## [[4]]
## [1] 4
##
## [[5]]
## [1] 5
如果要将索引作为变量传递,则可能更简单:
eval(parse(text=sprintf('x_1[[%s]] <- %s', 1, 123)))
答案 1 :(得分:1)
我无法想象您为什么不知道列表名称的充分理由。所以这可能是一个XY问题,你应该重新考虑你的方法。
SendGrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));
无法在此处工作,因为它会将对象分配到环境中。那不是你想要做的。您希望将子分配到列表中。
但是,假设您有一些任意命名列表,希望您至少知道包含该列表的环境。然后你可以这样做:
assign