R“数据”的问题必须是向量类型,为“ NULL”

时间:2018-10-16 22:59:44

标签: r function null

我创建了此功能:

vlw=function(x,y)
{
for(i in 0:20){
if((i>=1)&(i<=4)|(i>=6)&(i<=9)|(i>=11)&(i<=14)|(i>=16)&(i<=19))
{
  next()
}
print(ifelse((x<i)&(y<i)|(x>(i+5))&(y>(i+5)),0,ifelse((x<i)&(y<(i+5)),(y-i)/5,ifelse((x<(i+5))&(y>(i+5)),(i+5-x)/5,ifelse((x>i)&(y<(i+5)),(y-x)/5,1)))))
  }
}

如果我使用这些输入:

iv=c(-1,-2,4,9,10,5,-1)
fv=c(3,-1,6,10,11,10,8)

我的结果是:

[1] 0.6 0.0 0.2 0.0 0.0 1.0 1.2
[1] 0.0 0.0 0.2 1.0 1.0 1.0 0.6
[1] 0 0 0 0 1 0 0
[1] 0 0 0 0 0 0 0
[1] 0 0 0 0 0 0 0

问题是我想根据此结果创建一个矩阵,但是当我输入时:

exp4=as.matrix(vlw(iv,fv),5,7)

我读到此错误:

数组(x,c(length(x),1L),如果(!is.null(names(x)))list(names(x),:   “数据”必须是向量类型,为“ NULL

你知道我该怎么解决吗?

1 个答案:

答案 0 :(得分:0)

这是一个更简单的示例,可以更清楚地说明问题:

f = function() {
  for (i in 1:2) {
    if (i==2) next()
    print (i)
  }
}

x = f()
# [1] 1

x
# NULL

从本质上讲,该函数将返回上一次求值的任何表达式。在这种情况下,next()next返回的值为NULL。因此,当您分配结果f()时,其值为NULL

您应该在向量中填充要打印的值,然后返回该向量,而不是在函数内部使用print

赞:

vlw=function(x,y)
{
  output=c()
  for(i in 0:20) {
    if((i>=1)&(i<=4)|(i>=6)&(i<=9)|(i>=11)&(i<=14)|(i>=16)&(i<=19))
    {
      next()
    }
    output =c(output,
      ifelse((x<i)&(y<i)|(x>(i+5))&(y>(i+5)),0,ifelse((x<i)&(y<(i+5)),(y-i)/5,ifelse((x<(i+5))&(y>(i+5)),(i+5-x)/5,ifelse((x>i)&(y<(i+5)),(y-x)/5,1))))
      )
  }
  return(output)
}


exp4 = matrix(vlw(iv,fv),5,7)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]  0.6  1.0  1.0    0    0    0    0
#[2,]  0.0  1.2  1.0    0    0    0    0
#[3,]  0.2  0.0  1.0    0    0    0    0
#[4,]  0.0  0.0  0.6    1    0    0    0
#[5,]  0.0  0.2  0.0    0    0    0    0