我想要读入某些文件(VI3g栅格数据)。我想要读入的文件的名称保存在名为“filename”的向量中(向量的第一个元素是我要读入的第一个文件的名称,以及我想要将它们分配给的变量名称(向量的第一个元素是我想要读入的第一个变量的名称)称为'varname ”。
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 :(得分:0)
我会提出以下想法:
apply(df,1,function(x) { assign(x['varname'], getValues(ReadVI3g(x['filename'])), env=.GlobalEnv) })
env=.GlobalEnv
是必需的,因此variable_xy
在GlobalEnv中设置,而不仅仅在内部函数范围内。
旁注:循环本身并不是低效的,但必须明智地使用它们,在可能的情况下更喜欢* apply系列。