将对象追加到R

时间:2016-10-31 21:17:26

标签: r

我是R的新人,在为大学研究时,我写了这段代码:

pixel <- function(a){z <- 22-a%/%22 ; y <- a-22*a%/%22 
                b <- c(y, z)
                return(b)}
a <- c(339, 339, 270, 383, 205, 269, 275, 413, 203, 364, 365, 317, 318, 342, 360, 408, 319, 278, 339, 317, 294)
archivos <- list.files(pattern = "sR.")

for (j in 1:length(archivos)) {
        assign("n", nc_open(archivos[j]))
        assign("r", ncvar_get(eval(n), "pcp"))
        assign(sprintf("o%d", j), c(1:length(a))) 
        for (i in 1:length(a){
                y <- pixel(a[i])[1] 
                z <- pixel(a[i])[2]
                eval(as.name(sprintf("o%d", j)))[i] <- r[y,x]
                } 
}

我打算将pixel函数的输出存储到为j循环的每个值创建的向量中。

我相信代码的最后一部分是问题,我测试了以下代码:

> eval(as.name(sprintf("o%d", 1)))[1]
[1] 89

我可以检索向量o1的第一个值,即89,但是当尝试在该位置放置一个新值时,R不允许我:

> eval(as.name(sprintf("o%d", 1)))[1]<-1
Error in eval(as.name(sprintf("o%d", 1)))[1] <- 1 : 
  target of assignment expands to non-language object

最终输出是空矢量(o1o2等)。我一直在寻找不同的方法,但我被卡住了。

我很高兴听到建议。

2 个答案:

答案 0 :(得分:1)

至于你的功能,它已经被矢量化了,所以让我们只返回一个带有yz列的矩阵,而不是将它们粘贴在一个向量中。然后,我们可以在a上同时运行它,而不是使用for循环:

pixel <- function(a) {
    z <- 22 - a %/% 22
    y <- a - 22 * a %/% 22
    b <- matrix(c(y, z), ncol = 2)
    colnames(b) = c("y", "z")
    return(b)
}

pixel(a)
 #       y  z
 # [1,]  9  7
 # [2,]  9  7
 # [3,]  6 10
 # [4,]  9  5
 # [5,]  7 13
 # [6,]  5 10
 # [7,] 11 10
 # [8,] 17  4
 # [9,]  5 13
 # ...

对于您的其他内容,如果没有可重现的示例,很难进行具体更改,但一般情况下,如果您使用assign,则会使事情过于复杂。最好使用list。在How to make a list of data frames?中有很多关于此问题的讨论。

这样的事情应该让你开始

archivos <- list.files(pattern = "sR.")
r_list = lapply(archivos, nc_open)
p_list = lapply(r_list, ncvar_get, "pcp")

我不确定你的代码的最后一行是做什么的,但是现在你已经可以更容易地使用表单了。

答案 1 :(得分:1)

经过几次尝试后,我想出了一个解决方案,不是优雅也不是令人印象深刻但功能齐全(尽管代码,如上面提到的Gregor,有点过于复杂):

for (j in 1:length(archivos)) {
        assign("n", nc_open(archivos[j]))
        assign("r", ncvar_get(eval(n), "pcp"))
        **assign(sprintf("o%d", j), c(1:length(a)))** I omitted this
        for (i in 1:length(a){
                y <- pixel(a[i])[1] 
                z <- pixel(a[i])[2]
                **prec[i] <- r[y,z]
                assign(sprintf("o%d", j), prec)** I added this
                } 
}

简而言之,我创建了一个名为prec[i]的时间列表,它使用assign函数记录,名称为o1o2等。

正如我所说它不优雅但它现在有效,直到我改进所有代码。 谢谢大家。