如果我在分段函数(ggplot2)上从 >= 更改为 >,为什么我的连续图会突然发生变化?

Bla*_*ard 2 r graph continuous ggplot2

我将使用ggplot2基于分段函数的 R 库来描绘连续图。

fun1 <- function(x){
  ifelse(x<=-2, -1.5*(-x)^2, NA)
}
fun2 <- function(x){
  ifelse(x>-2, 6*x-5, NA)
}
gg <- ggplot(data.frame(x = c(-5, 5)), 
              aes(x = x))+
  stat_function(fun = fun1, n=1001)+
  stat_function(fun = fun2, n=1001)
print(gg)   
Run Code Online (Sandbox Code Playgroud)

这显示了分段函数的正确图形。

在此输入图像描述

但是,如果我将条件稍微改变一下,例如ifelse(x<-2, -1.5*(-x)^2, NA)ifelse(x>=-2, 6*x-5, NA),那么图表的第一部分将突然无法正确描绘。

在此输入图像描述

这似乎该ifelse函数现在总是返回-6所有值x,无论<=-2是否返回。

但为什么会突然发生这样的变化呢?我尝试使用标准绘图函数描绘连续曲线,但仍然得到相同的结果......

All*_*ron 5

当您在运算符之间不留空格时,就会发生这种情况。除了降低代码的可读性之外,有时还会使解析器感到困惑。在你的情况下,解析器解释x<-2x <- 2,即“将 2 分配给 x”,而不是x < -2,即“x 小于负 2”。

当您使用分配作为 中的第一个参数时ifelse,它将评估分配值的“真实性”,并且由于 2 是正整数,因此它将始终评估为 true。由于在计算该子句时,x 为 2,因此对于该函数的所有输入值,您的输出将为-1.5 * (-2)^2,即 -6。

如果您使用空格(或括号),则不会发生这种情况:

fun1 <- function(x){
  ifelse(x < -2, -1.5*(-x)^2, NA)
}
fun2 <- function(x){
  ifelse(x > -2, 6*x-5, NA)
}
gg <- ggplot(data.frame(x = c(-5, 5)), 
             aes(x = x))+
  stat_function(fun = fun1, n=1001)+
  stat_function(fun = fun2, n=1001)
print(gg)   
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 鹰眼艾伦·卡梅伦!:-) (2认同)
  • @Blaszard 我认为这一点也不愚蠢。如果您习惯使用不使用赋值运算符的语言编写(或者不评估赋值;可以说代码应该在此处抛出一个有用的错误),则很容易犯此错误 (2认同)