有人可以让我深入了解为什么这段代码不起作用?
tr <- function(x,y,z){eval(as.symbol(paste0(x,y,z)))}
sr <- c("bla","gla")
blablabla <- as.numeric()
tr("bla",sr[1],"bla")[1] <- 1
我定义了一个函数tr,它粘贴三个字符串并将其转换为变量向量。然后我尝试将该向量的第一个元素更改为1,但是我一直遇到错误:
tr中的错误(“bla”,sr [1],“bla”)[1]&lt; - 1: 赋值目标扩展为非语言对象
答案 0 :(得分:1)
错误原因。
as.symbol(paste0(x,y,z))
从您粘贴的字符串中创建一个符号。
eval(as.symbol(paste0(x,y,z))
评估该符号的值。所以,在你创建了一个名为&#39; blablabla&#39;没有任何内容。然后你评估它以给numeric(0)
。
然后返回numeric(0)
并尝试为其指定一个值,为您提供错误。
错误解决方案
我不会放入支票和事情,但是假设您创建了一个名为blablabla的变量并将值指定为1(blablabla <- 1
)。这可以防止先前的错误发生。然后使用代码:
tr <- function(x,y,z, index, value){
var_temp <- eval(as.symbol(paste0(x,y,z)))
var_temp[index] <- value
return(var_temp)
}
根据索引和值参数,为向量中的不同值指定值。您还必须将输出分配给某个东西,因为blablabla只会在函数范围内更改,因此可以使用它:blablabla <- tr("bla", "bla", "bla", 1, 2)
将第一个元素设置为两个。
这会回答这个问题吗?
答案 1 :(得分:1)
据我所知,R只允许你对变量“name”进行赋值。
如果您这样做,我猜你的代码会起作用:
A <- tr("bla",sr[1],"bla")
A[1] <- 1
希望这有帮助。