dim()外部错误

时间:2015-07-04 12:15:14

标签: r function perspective

我已经制作了以下函数我想制作一个使用函数" persp"的三维图像,因此我使用函数outer,来获取每个组合的函数值a和b,但这会产生错误。

所以我的代码是:

a<- seq(from=0, to=5,by=0.25)
b<- seq(from=0.1, to=2,by=0.1)

Rab <- function(a,b){
  r <- matrix(ncol = 1, nrow = 4)
  for (p in seq(from=0, to=4,by=1)){
  g <- ifelse(a>=0 & a<1-1/p & p >b, a*p,
         ifelse(a>=0 & a<1-1/b & p< b, -1+(a+1/b),
                ifelse(a > 1-1/max(p,b),-1+p,NA)))
  w <- p
  r[w] <- g
  }
  return(r)
} 

q <- outer(a,b,Rab)

然后我收到以下错误和警告消息,我不明白。

Error in outer(a, b, Rab) : 
  dims [product 420] do not match the length of object [4]
In addition: Warning messages:
1: In r[w] <- g :
  number of items to replace is not a multiple of replacement length
2: In r[w] <- g :
  number of items to replace is not a multiple of replacement length
3: In r[w] <- g :
  number of items to replace is not a multiple of replacement length
4: In r[w] <- g :
  number of items to replace is not a multiple of replacement length

我试过阅读它,我认为这是因为我构建了函数Rab错误,但我不知道如何纠正它。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你的 Rab 功能是错误的。 外部的文档说

  

X和Y必须是FUN的合适参数。在调用FUN之前,每个都将通过rep来扩展长度为X和Y的乘积。

     

使用这两个扩展向量作为参数(加上......中的任何参数)调用FUN。它必须是一个向量化函数(或一个名称),它至少需要两个参数,并返回一个与第一个(和第二个)长度相同的值。

因此,在您的示例中,ab扩展为两个都有length(a) * length(b),在您的情况下恰好是420。你的函数 Rab 应该返回一个相同长度的向量。

Rab 中,您计算​​一个具有正确长度的矢量g,并且该矢量适合作为返回值。您可以尝试将其分配给矩阵r中的条目,而不是返回此向量。请注意,此矩阵定义为

r <- matrix(ncol = 1, nrow = 4)

并且不能在其行或列中保存长度为420的向量(这是警告消息的内容)。在此过程中,您将丢失除向量g的第一个元素之外的所有元素。然后,您继续使用稍微不同的参数集重新计算g,这将我们带到下一个问题。这些计算发生在如下定义的循环中:

for (p in seq(from=0, to=4,by=1)){
  ## compute g ...
  r[p] <- g
}

你似乎期望这个循环执行四次,但它实际上运行了五次,p的值等于0,1,2,3和4.这意味着第一个g被分配给r[0],R默默地忽略。当然,当你尝试返回r时,这一点都不重要,因为它只有4(而不是420),这会触发错误。

我不相信我真的明白你想要做什么,但以下可能是朝着正确方向迈出的一步。

Rab <- function(a, b, p){
  ifelse(a>=0 & a<1-1/p & p >b, a*p,
                 ifelse(a>=0 & a<1-1/b & p< b, -1+(a+1/b),
                        ifelse(a > 1-1/max(p,b),-1+p,NA)))
}

对于固定值g,这将从您的函数计算p并返回结果。你这样称呼(对于p = 0):

q <- outer(a, b, Rab, 0)

如果您想为多个不同的p拨打电话,可以执行类似

的操作
q <- lapply(0:3, function(x,y,f, p) outer(x, y, f, p), x=a, y=b, f=Rab)

这会用p = 0,1,2和3调用 Rab (我猜这是你想要的,根据需要进行调整)。