我是R的新人,在为大学研究时,我写了这段代码:
pixel <- function(a){z <- 22-a%/%22 ; y <- a-22*a%/%22
b <- c(y, z)
return(b)}
a <- c(339, 339, 270, 383, 205, 269, 275, 413, 203, 364, 365, 317, 318, 342, 360, 408, 319, 278, 339, 317, 294)
archivos <- list.files(pattern = "sR.")
for (j in 1:length(archivos)) {
assign("n", nc_open(archivos[j]))
assign("r", ncvar_get(eval(n), "pcp"))
assign(sprintf("o%d", j), c(1:length(a)))
for (i in 1:length(a){
y <- pixel(a[i])[1]
z <- pixel(a[i])[2]
eval(as.name(sprintf("o%d", j)))[i] <- r[y,x]
}
}
我打算将pixel
函数的输出存储到为j
循环的每个值创建的向量中。
我相信代码的最后一部分是问题,我测试了以下代码:
> eval(as.name(sprintf("o%d", 1)))[1]
[1] 89
我可以检索向量o1
的第一个值,即89,但是当尝试在该位置放置一个新值时,R不允许我:
> eval(as.name(sprintf("o%d", 1)))[1]<-1
Error in eval(as.name(sprintf("o%d", 1)))[1] <- 1 :
target of assignment expands to non-language object
最终输出是空矢量(o1
,o2
等)。我一直在寻找不同的方法,但我被卡住了。
我很高兴听到建议。
答案 0 :(得分:1)
至于你的功能,它已经被矢量化了,所以让我们只返回一个带有y
和z
列的矩阵,而不是将它们粘贴在一个向量中。然后,我们可以在a
上同时运行它,而不是使用for
循环:
pixel <- function(a) {
z <- 22 - a %/% 22
y <- a - 22 * a %/% 22
b <- matrix(c(y, z), ncol = 2)
colnames(b) = c("y", "z")
return(b)
}
pixel(a)
# y z
# [1,] 9 7
# [2,] 9 7
# [3,] 6 10
# [4,] 9 5
# [5,] 7 13
# [6,] 5 10
# [7,] 11 10
# [8,] 17 4
# [9,] 5 13
# ...
对于您的其他内容,如果没有可重现的示例,很难进行具体更改,但一般情况下,如果您使用assign
,则会使事情过于复杂。最好使用list
。在How to make a list of data frames?中有很多关于此问题的讨论。
这样的事情应该让你开始
archivos <- list.files(pattern = "sR.")
r_list = lapply(archivos, nc_open)
p_list = lapply(r_list, ncvar_get, "pcp")
我不确定你的代码的最后一行是做什么的,但是现在你已经可以更容易地使用表单了。
答案 1 :(得分:1)
for (j in 1:length(archivos)) {
assign("n", nc_open(archivos[j]))
assign("r", ncvar_get(eval(n), "pcp"))
**assign(sprintf("o%d", j), c(1:length(a)))** I omitted this
for (i in 1:length(a){
y <- pixel(a[i])[1]
z <- pixel(a[i])[2]
**prec[i] <- r[y,z]
assign(sprintf("o%d", j), prec)** I added this
}
}
简而言之,我创建了一个名为prec[i]
的时间列表,它使用assign
函数记录,名称为o1
,o2
等。
正如我所说它不优雅但它现在有效,直到我改进所有代码。 谢谢大家。