我试图在值0 - 1:
上绘制此函数dweird <- function(x){
if (x< 0){return(0)}
if (x> 1){return(0)}
if (x >= 0 & x < (1/3)) {return((1))}
if (x >= (1/3) & x < (2/3)){return(3/2)}
if (x >= (2/3) & x <= 1){return((1/2))}
}
这是我使用
的代码library(ggplot2)
ggplot(data.frame(x=c(0, 1)), aes(x)) +
stat_function(fun=function(x) dweird(x), linetype="dotted")
但是这会返回错误消息
警告讯息: 在if(x> = 0&amp; x&lt;(1/3)){: 条件的长度> 1,只使用第一个元素
要清楚,该函数应绘制y = 1的一条直线,0-1 / 3,另一条y = 1.5,1 / 3-2 / 3,另一条线,1/2,2/3到1.
为什么我收到错误消息的任何想法?
答案 0 :(得分:2)
您需要对您的功能进行矢量化。 ggplot并不期望一次评估一个点。懒惰的方式是使用vectorize
dweird_v_lazy = Vectorize(dweird)
但更好的方法是首先以这种方式对其进行编码:
dweird_v = function(x) {
ifelse(x < 0, 0,
ifelse(x < 1/3, 1,
ifelse(x < 2/3, 3/2,
ifelse(x < 1, 1/2, 0))))
}
然后这将正常工作:
x = seq(-.2, 1.2, length.out = 15)
dweird_v(x)
[1] 0.0 0.0 0.0 1.0 1.0 1.0 1.5 1.5 1.5 0.5 0.5 0.5 0.0 0.0 0.0
你的情节也是如此:
library(ggplot2)
ggplot(data.frame(x=c(0, 1)), aes(x)) +
stat_function(fun= dweird_v, linetype="dotted")
请注意,当您将单个功能传递给stat_function
时,您不必将其转换为匿名功能,您可以告诉它您的功能名称。
答案 1 :(得分:1)
你需要&#34;矢量化&#34;你的职能:
dweird <- Vectorize(dweird)