在R中使用else if语句绘制函数

时间:2017-09-20 01:58:03

标签: r function if-statement plot

尝试在区间[-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()适用于我测试的所有值。有什么想法吗?

1 个答案:

答案 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。

请注意,拥有全局变量(例如ab)通常是一件坏事。