R语言 如何让geom_function与两步函数一起工作?

b09cbbtk  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(91)

我发现很难解释我想用文字做什么,所以我只是把我的代码贴在下面。

fun <- function(a, x) {
  output <- a*dlnorm(a, 2.72 - x, 0.52)
  return(output)
}

fun2 <- function(x) {
  output2 <- integrate(fun, lower = 0, upper = 200, x = x)
  return(output2)
}

a <- seq(-5, 5, .1)

list <- list()

for(ai in 1:length(a)){
  list[[ai]] <- fun2(a[[ai]])
}

list %>% 
  map(pluck, "value") %>% 
  unlist() %>% 
  bind_cols(a) %>% 
  ggplot(aes(x = `...2`, y = `...1`)) + 
  geom_line()

所以我们首先有一个函数,它接受ax的参数。然后我们做另一个函数,将第一个函数在x的值上积分,最后我们绘制a的值上的积分。
请注意,我正在使用for循环手动计算绘图曲线。我想避免使用for循环,我想直接通过geom_function来完成。但是我不知道该怎么办。我一直在尝试这个

ggplot() + 
  geom_function(fun = fun2) + 
  xlim(-5, 5)

但不幸的是这行不通。那么,在代码中指定这一点的正确方法是什么呢?

x4shl7ld

x4shl7ld1#

integrate函数不会从vector输入返回vector。它只需要一个输入,并返回一个结构作为输出,例如。

> str(fun2(1))
List of 5
 $ value       : num 6.39
 $ abs.error   : num 9.92e-06
 $ subdivisions: int 6
 $ message     : chr "OK"
 $ call        : language integrate(f = fun, lower = 0, upper = 200, x = x)
 - attr(*, "class")= chr "integrate"

所以你需要做的是让fun2返回一个与x形状相同的值的向量。这涉及到一个循环,但您可以使用Vectorize函数隐藏它。比如说

fun2 <- function(x) {
  # This definition only handles a scalar x
  integrate(fun, lower = 0, upper = 200, x = x)$value
}
# This makes it handle a vector x by looping over the values
fun2 <- Vectorize(fun2)

现在geom_function(fun = fun2)就可以了。

相关问题