尝试在区间[-1,1]上绘制以下函数,但我收到错误代码:
"Warning messages:
1: In if (g < a) { :
the condition has length > 1 and only the first element will be used
2: In if (g >= a & g <= b) { :
the condition has length > 1 and only the first element will be used"
unifCDF<-function(g) {
if (g< a) {
0
}
else if (g>=a & g<=b) {
(g-a)/(b-a)
}
else if (g>b) {
1
}
}
我知道函数本身有效,因为unifCDF()适用于我测试的所有值。有什么想法吗?
答案 0 :(得分:0)
您的功能适用于单个值:
> unifCDF(.5)
[1] 0.75
但不适用于矢量:
> unifCDF(c(0.2,.3))
[1] 0.60 0.65
Warning messages:
1: In if (g < a) { :
the condition has length > 1 and only the first element will be used
2: In if (g >= a & g <= b) { :
the condition has length > 1 and only the first element will be used
和plot.function需要函数来处理向量。懒惰的方法就是Vectorize
你的功能:
> unifCDF=Vectorize(unifCDF)
> unifCDF(c(0.2,.3))
[1] 0.60 0.65
> plot.function(unifCDF,-1,1)
然后起作用。
正确的方法是对其进行编码,以便它自然地处理向量参数。
unifCDF = function(g){
res = (g-a)/(b-a)
res[g<a]=0
res[g>b]=1
res
}
在此代码中,res
始终是与g
长度相同的向量。第一行计算g
的所有值的斜率位,然后接下来的两行将(a,b)限制之外的相关位设置为0和1。
请注意,拥有全局变量(例如a
和b
)通常是一件坏事。