2015-09-04 62 views
0

我想要读取某些文件(VI3g栅格数据)。我想要读入的文件的名称保存在名为'filename'的矢量中(其中第一个元素vector是我想要读取的第一个文件的名称),并且我想将它们分配给的变量名称(其中第一个元素是第一个要读入的变量的名称)是称为'varname'。getValues在循环中

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新手,我倾向于用循环解决很多问题。我知道这是低效的,而且通常有更聪明的解决方案。有没有简单的方法来避免这里的循环?

非常感谢您提前。

+0

尝试'getValues(get(varname [i]))' – Tensibai

+0

或者简单地'assign(varname [i],getValues(ReadVI3g(filename [i])))' – Tensibai

+0

更好的方法可能是使用lapply,在您的环境中使用所有这些媒介并不现实。就像'myvars < - lapply(varnames,function(x){........}' – Heroka

回答

0

我会去的想法如下:需要

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

env=.GlobalEnv所以variable_xy设置在GlobalEnv不仅在内部的功能范围。

备注:循环本质上并不低效,但必须明智地使用循环,在可能的情况下更愿意使用*应用系列。