我已经制作了以下函数我想制作一个使用函数" 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错误,但我不知道如何纠正它。
感谢任何帮助。
答案 0 :(得分:1)
你的 Rab 功能是错误的。 外部的文档说
X和Y必须是FUN的合适参数。在调用FUN之前,每个都将通过rep来扩展长度为X和Y的乘积。
使用这两个扩展向量作为参数(加上......中的任何参数)调用FUN。它必须是一个向量化函数(或一个名称),它至少需要两个参数,并返回一个与第一个(和第二个)长度相同的值。
因此,在您的示例中,a
和b
扩展为两个都有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 (我猜这是你想要的,根据需要进行调整)。