我正在尝试绘制此等式。唯一更改的变量是n。 x始终是x = 1到x = 4的和。
x = seq(from = 1, to = 4, by = 1)
lf = function(n) choose(4, 3)*choose(4, 1)*exp(3*n) / sum(choose(4,x)*choose(4, 4-x)*exp(x*n))
当我尝试使用以下方法进行绘制时:
plot(lf, from = -3, to -3)
我得到了错误:
“较长的对象长度不是较短对象长度的倍数。较长的对象长度不是较短对象长度的倍数。”
答案 0 :(得分:3)
问题是lf
没有在n
上进行矢量化;也就是说,它不接受向量作为输入。例如,sum(1:x)
也没有在x
上进行矢量化处理,这意味着sum(1:(1:2))
不会返回c(1, 3)
。
sum(choose(4,x)*choose(4, 4-x)*exp(x*n))
根据n
。
由于您要绘制函数的方式(例如,plot
尝试使用向量作为输入),现在需要向量化。一种解决方案是使用
plot(Vectorize(lf, "n"), from = -3, to = 3)
另一种方法是以矢量化方式定义lf
:
lf <- function(n)
sapply(n, function(nn)
choose(4, 3) * choose(4, 1) * exp(3 * nn) / sum(choose(4, x) * choose(4, 4 - x) * exp(x * nn)))
plot(lf, from = -3, to = 3)
答案 1 :(得分:0)
Plot()或curve()正在生成200个长度的矢量,以将函数绘制为n。
因此,当您将n * x相乘时,尺寸不适合,R会警告您并将de x数组扩展为123412341234 ...,然后相乘。
将浏览器放入您的函数中,您将看到它是否确实满足您的实际需求。
lf = function(n){
browser()
choose(4, 3)*choose(4, 1)*exp(3*n) / sum(choose(4,x)*choose(4, 4-x)**(x*n))
}
希望有帮助!