0

我有一些我想读入的文件(VI3g 光栅数据)。我想读入的文件的名称保存在一个名为“文件名”的向量中(其中向量的第一个元素是我要读取的第一个文件),以及我要分配给它们的变量名称(其中向量的第一个元素是我要读取的第一个变量的名称)称为“varname”。

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

我的方法(有效)如下:

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

但数据是光栅层。我需要进一步计算的是矢量,因为某些计算不适用于光栅层。所以我的方法是通过 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"’

我理解这个问题,但我无法找到解决方案。我也尝试用 assign 解决这个问题,但它也不起作用。

并跟进问题:由于我是 R 新手,我倾向于用循环解决很多事情。我知道它效率低下,而且通常有更聪明的解决方案。有没有一种简单的方法可以避免这里的循环?

非常感谢您提前。

4

1 回答 1

0

我会采用以下想法:

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

env=.GlobalEnv是必需的,因此在variable_xyGlobalEnv 中设置,而不仅仅是在内部函数范围内。

旁注:循环本身并不是低效的,但必须明智地使用它们,如果可能,更喜欢 *apply 系列。

于 2015-09-04T08:44:01.520 回答