2015-03-13 2 views
0

Я борюсь с циклом в R, где мне нужно использовать имена динамических переменных (о которых мне говорят, это плохая идея из других сообщений о именах динамических переменных, но я довольно что мне нужно основываться на моей файловой структуре). Каждая папка, в которую входит цикл, есть другое количество файлов.Назначение значений внутри динамически названной матрицы в 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 и присвоить значение местоположения в [г, ч] я сделал это раньше с реальным имена переменных, но я борюсь с добавлением динамического элемента. Это то, на что он похож, и на ошибки, которые я получаю.

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 и назначить организовать последнее заявление, и я получаю ошибки, такие как «недействительное первое задание», неправильное число измерений, и цель назначения расширяется неязыковым объект.

Благодарим за помощь!

R версии 3.1.1 «Носок его мне» с библиотекой (растр)

ответ

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 
    } 

Так что спасибо всем, кто пытался расшифровать это, это была запутанной проблемой для меня потребовалось некоторое время, чтобы понять, как лучше подойти к нему, (и, очевидно, как объясни это). Я надеюсь, что это помогает кому-то!

Смежные вопросы