我正在努力使用R中的循环,我必须使用动态变量名称(我被告知其他关于动态变量名称的帖子是一个坏主意,但我很确定我需要基于我的文件结构体)。循环进入的每个文件夹,都有不同数量的文件。
动态变量名称包含矩阵,我需要查看矩阵的每一行/列并输出一个新矩阵。
简化示例:
var 1 is a matrix(0,40,40)
var 2 is a matrix(0,45,45)
var 3 is a matrix(0,40,40)
For (f in 1:(length of var3s)) # the number of files in the folder, in each folder:
For (g in 1: ncol(var1)) {
For (h in 1: nrow(var1)) {
if (var 1[g,h]>4 & var 2[g,h]<1)
{ var3[f] [g,h]<-1} # <- you cannot do this, but this is ultimately what I want
}
}
我想从变量3的列表中取出第f个变量矩阵,并为[g,h]处的位置赋值 我之前用真正的变量名称做过这个,但我正在努力添加动态元素。这就是它的样子和我得到的错误。
for (f in 1:(length(LD139_040))){
assign(paste0("LD139_040s",f),
matrix(0,nrow(eval(parse(text=paste0("B139_040",f)))),
ncol(eval(parse(text=paste0("B139_040",f)))))) # this effectively creates my new matrix (var3 above) the size I need based on the files above
for (g in 1:(ncol(eval(parse(text=paste0("B139_040",f)))))){
for (h in 1:(nrow(eval(parse(text=paste0("B139_040",f)))))){
if (S139_040[g,h]>10 &
(assign(paste0("LD139_040",f), as.matrix(raster(LD139_040[f]))))[g,h]>.295 &
(assign(paste0("LD139_040",f), as.matrix(raster(LD139_040[f]))))[g,h]<.33 &
(assign(paste0("B139_040",f), as.matrix(raster(Blue139_040[f]))))[g,h]<180)
# this section also works and will give me a t/f at each location [g,h]
# if true, assign the value 1 to the new matrix LD139_040 at f
{assign(paste0("LD139_040s", f)[g,h], 1)}
}
}
}
我已经尝试了各种eval和assign的组合来组织最后一个语句,并且我得到诸如“无效的第一次分配”,不正确的维度数和分配目标扩展到非语言对象之类的错误。
感谢您的帮助!
R版本3.1.1“使用库(光栅)”将其“锁定到我”
答案 0 :(得分:0)
这不需要动态变量名。在循环内的每次迭代中,所有名称将同时改变。
例如,这是我回答代码块2中的部分的方式:
for (f in 1:(length(LD139_040))){
currenttile<-LD139_040[f]
Blue<-B139_040[f]
newmatrix<- matrix(0,nrow(Blue),ncol(Blue))
for (g in 1:(ncol(B139_040[f]))){
for (h in 1:(nrow(B139_040[f]{
if (S139_040[g,h]>10 & currenttile[g,h]>.295 & currenttile[g,h]<.33 & Blue [g,h]<180)
{newmatrix[g,h]<-1}
}
}
}
更简单地说,因为我了解到只要矩阵具有相同的尺寸,您就不必遍历每个位置:
for (f in 1:(length(LD139_040))){
currenttile<-LD139_040[f]
Blue<-B139_040[f]
newmatrix<- matrix(0,nrow(Blue),ncol(Blue))
currenttile[currenttile >.295 & currenttile <.33]<- 1
Blue[Blue<180]<- 1
newmatrix[Blue==1 & currenttile==1]<- 1
}
非常感谢所有试图破译这一点的人,对我来说这是一个令人困惑的问题,花了一段时间来弄清楚如何最好地接近它,(显然如何解释它)。我希望这有助于某人!