R绘图函数给出了奇怪的答案

R绘图函数给出了奇怪的答案,r,plot,R,Plot,我试着用R图得到一些函数的曲线。有时候,我会得到很奇怪的结果。这里有一个例子 u=c(2,2,2,2,2) elas=function(P){ prob=P/sum(u,P) return(prob) } plot(elas,0,6) 该代码给出如下图: 这显然是不对的。正确的代码应如下所示: 我知道如果我把代码的第三行改成 prob=P/(sum(u)+P) 这会奏效的。但我不明白为什么我的原始代码不起作用。这是否意味着我无法绘制嵌入另一个函数的函数?sum(u,p)是一个

我试着用R图得到一些函数的曲线。有时候,我会得到很奇怪的结果。这里有一个例子

u=c(2,2,2,2,2)
elas=function(P){
  prob=P/sum(u,P)
  return(prob)
}
plot(elas,0,6)
该代码给出如下图:

这显然是不对的。正确的代码应如下所示:

我知道如果我把代码的第三行改成

  prob=P/(sum(u)+P)
这会奏效的。但我不明白为什么我的原始代码不起作用。这是否意味着我无法绘制嵌入另一个函数的函数?

sum(u,p)
是一个值,等于
u
p
中所有值的总和。因此,在
elas
中,
P
get的每个值都被相同的数字除以(在您的示例中为313)

sum(u)+p
是一个向量,包含
p
的每个单独值,并向其添加
sum(u)
。所以在
elas
的第二个版本(我在下面称之为
elas2
)中,
P/(sum(u)+P)
导致
P
sum(u)+P
逐元素划分

考虑下面的例子

u=c(2,2,2,2,2)
x=seq(0,6,length=101)

sum(u,x)

总和(u+p)=u+p中每个值的总和

总和(u)+p=u加p中的值之和

示例:
u=c(1,2,3),p=5

sum(u+P) = (1+5) + (2+5) + (3+5) = 6+7+8 = 21
sum(u) + P = (1+2+3) + 5 = 6 + 5 = 11
为了


elas如果我理解正确,如果我绘制一个函数而不是一个数据帧,R仍然会首先模拟“x”,然后将x向量中的所有值放在函数中,以计算函数的值并将其存储为y。然后用x和y组成一个数据框,然后绘制数据框。但是如果我有一些函数,比如sum(x),它会对所有的x求和并使用该值,而不是每个x来计算函数值。然而,如果我真的需要一些像sum这样的函数,并且希望在计算y和绘图之前,用u和每个单独的x求和,我应该怎么做?在这个简单的例子中,我可以只写sum(u)+x,但当涉及到更复杂的函数时,我不知道如何处理它。是的<代码>绘图
在输入函数(如
elas
)时调用
曲线
函数。通过在控制台中键入
curve
,可以查看
curve
的代码。查看这一行的函数代码:
x是一个向量。如果要在x的每个元素中添加10,请执行
x+10
。如果有两个向量要逐元素相加,可以执行
x+u
。但请注意,在这种情况下,如果向量长度不相等,则较短的向量将被循环使用。例如,运行
1:7+1:3
,看看会发生什么。
sum(u) + x
  [1] 10.00 10.06 10.12 10.18 10.24 10.30 10.36 10.42 10.48 10.54 10.60 10.66 10.72 10.78
 [15] 10.84 10.90 10.96 11.02 11.08 11.14 11.20 11.26 11.32 11.38 11.44 11.50 11.56 11.62
 [29] 11.68 11.74 11.80 11.86 11.92 11.98 12.04 12.10 12.16 12.22 12.28 12.34 12.40 12.46
 [43] 12.52 12.58 12.64 12.70 12.76 12.82 12.88 12.94 13.00 13.06 13.12 13.18 13.24 13.30
 [57] 13.36 13.42 13.48 13.54 13.60 13.66 13.72 13.78 13.84 13.90 13.96 14.02 14.08 14.14
 [71] 14.20 14.26 14.32 14.38 14.44 14.50 14.56 14.62 14.68 14.74 14.80 14.86 14.92 14.98
 [85] 15.04 15.10 15.16 15.22 15.28 15.34 15.40 15.46 15.52 15.58 15.64 15.70 15.76 15.82
 [99] 15.88 15.94 16.00
par(mfrow=c(1,3))

elas=function(P) {
   P/sum(u,P)
}

dat = data.frame(x, y=elas(x), y_calc=x/sum(u,x))

plot(dat$x, dat$y, type="l", lwd=2, ylim=c(0,0.020))
plot(elas, 0, 6, lwd=2, ylim=c(0,0.020))
curve(elas, 0, 6, lwd=2, ylim=c(0,0.020))
dat$y - dat$y_calc
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[43] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[85] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
elas2 = function(P) {
  P/(sum(u) + P)
}

dat$y2 = elas2(x)

plot(dat$x, dat$y2, type="l", lwd=2, ylim=c(0,0.4))
plot(elas2, 0, 6, lwd=2, ylim=c(0,0.4))
curve(elas2, 0, 6, lwd=2, ylim=c(0,0.4))
sum(u+P) = (1+5) + (2+5) + (3+5) = 6+7+8 = 21
sum(u) + P = (1+2+3) + 5 = 6 + 5 = 11
elas <- function(P){
    prob=P/(sum(u+P)
    return(prob)
}
y <- elas(0:6)
print(y)
#output of print y:
0.00000000 0.03225806 0.06451613 0.09677419 0.12903226 0.16129032
0.19354839
plot(0:6,y)
elas <- function(P){
    prob=P/(sum(u) + P)
    return(prob)
}
y <- elas(0:6)
print(y)
#Output of print(y)
plot(0:6,y)
0.00000000 0.09090909 0.16666667 0.23076923 0.28571429 0.33333333 0.37500000