получить значения в цикле

У меня есть определенные файлы (растровые данные VI3g), которые я хочу прочитать. Имена файлов, которые я хочу прочитать, сохраняются в векторе с именем «имя файла» (где первый элемент вектора — это имя файла). первый файл, который я хочу прочитать), и имена переменных (где первый элемент вектора — это имя первой переменной, которую я хочу прочитать), которым я хочу их присвоить, называется «имя_переменной».

filename      varname
file1.VI3g    variable_xy
file2.VI3G    variable_z
...           ...

Мой подход (который работает) к этому был следующим:

for (i in 1:12) {
assign(varname[i], ReadVI3g(filename[i]))
}

Но данные Rasterlayer. Что мне понадобится для дальнейших вычислений, так это векторы, так как некоторые вычисления не работают с Rasterlayers. Поэтому мой подход состоял в том, чтобы преобразовать данные через getValues, чтобы получить векторы вместо Rasterlayer.

for (i in 1:12) {
  assign(varname[i], ReadVI3g(filename[i]))
  varname[i]<- getValues(varname[i])
}

Однако это не работает. Я получаю сообщение:

Error in (function (classes, fdef, mtable)  : unable to find an 
inherited method for function ‘getValues’ for signature ‘"character",
"missing", "missing"’

Я понимаю проблему, но не могу найти решение. Я также пытался обойти проблему с назначением, но это тоже не сработало.

И дополнительный вопрос: поскольку я новичок в R, у меня есть тенденция решать довольно много задач с помощью циклов. Я знаю, что это неэффективно и что часто есть более умные решения. Есть ли простой способ избежать петли здесь?

Заранее большое спасибо.


person SpanishTrain    schedule 04.09.2015    source источник
comment
попробуй getValues(get(varname[i]))   -  person Tensibai    schedule 04.09.2015
comment
Или просто assign(varname[i], getValues(ReadVI3g(filename[i])))   -  person Tensibai    schedule 04.09.2015
comment
Лучшим подходом может быть использование lapply, обычно нецелесообразно иметь все эти векторы в вашей среде. Что-то вроде myvars <- lapply(varnames,function(x){........}   -  person Heroka    schedule 04.09.2015
comment
Мне кажется, что ваш подход в корне ошибочен. Всякий раз, когда вы думаете, что вам нужно использовать assign, вы ошибаетесь. Но поскольку вы не объясняете, чего хотите достичь, не приводите воспроизводимый пример и используете неизвестную функцию ReadVI3g, дать хороший совет невозможно. Вероятно, вам следует создать список объектов RasterLayer (s = lapply(filename, raster)) или RasterStack s = stack(filename). Вы также говорите, что «некоторые вычисления не работают с RasterLayers» — возможно, но вы можете ошибаться. Расскажите нам, что вы хотите сделать, чтобы мы могли направить вас в правильном направлении.   -  person Robert Hijmans    schedule 05.09.2015


Ответы (1)


Я бы пошел со следующей идеей:

apply(df,1,function(x) { assign(x['varname'], getValues(ReadVI3g(x['filename'])), env=.GlobalEnv) })

env=.GlobalEnv необходим, поэтому variable_xy устанавливается в GlobalEnv, а не только во внутренней области действия.

примечание: циклы по своей сути не являются неэффективными, но их нужно использовать с умом, по возможности отдавайте предпочтение семейству *apply.

person Tensibai    schedule 04.09.2015