Stat_function不接受参数列表(ggplot)

时间:2016-03-10 18:56:54

标签: r list function ggplot2

我试图让ggplot绘制一个函数,例如

library(ggplot2)
dframe <- data.frame(x = c(0:30), y = c(0:30 * 10))
LVB = function(t, Linf, K, t0) {
Linf*(1-exp(-K*(t-t0)))
}
parms = list("Linf" = 209, "K" = 0.47, "t0" = -1.61)
g = ggplot(dframe, aes(x, y))
   g = g + stat_function(fun = function(x) LVB(x, 200, 0.6, -1), color = "red")
g

Plot with red function

但我希望能够存储我的&#34; LVB&#34;的参数。列表中的函数 - 在这里,我已经定义了它们,但通常它们来自模型:

parms = list("Linf" = 209, "K" = 0.47, "t0" = -1.61)

我希望将以下行(我的模型参数)添加到绘图中,使其如下所示:

   g + stat_function(fun = function(x) LVB(x, 209, 0.47, -1.61), color = "blue")  

desired plot

但是,无论我做什么,stat_function都没有拿到我的名单......我在这里错过了什么?

 g + stat_function(fun = function(x) LVB(x, parms), color = "blue")
g
  

警告消息:stat_function()中的计算失败:参数&#34; K&#34;   缺少,没有默认

-----------

修改 Stibu回答了这个并提供了一个很好的解决方案阅读&#34; FSA&#34;中的功能包我认为这个也可以做 - 它要求参数的长度,如果它是三,它定义每个参数。偷偷摸摸但有效。

LVB = function(t, Linf, K, t0) 
   {
   if (length(Linf) == 3) {
        K <- Linf[[2]]
        t0 <- Linf[[3]]
        Linf <- Linf[[1]]
    }
Linf*(1-exp(-K*(t-t0)))
}

1 个答案:

答案 0 :(得分:2)

这与stat_function()无关,而与LVB()本身无关。您已使用语法

对其进行了定义
LVB(t, Linf, K, t0)

你必须尊重这一点。如果你运行

LVB(t, parms)

该函数认为它应该parms使用Linf并将Kt0视为缺失,这就是您收到错误的原因。

您可以使用do.call()解决此问题。 do.call()可用于将函数参数作为列表传递。所以以下三行是等价的

LVB(3, 5, 2, 1)
do.call(LVB, list(3, 5, 2, 1))
do.call(LVB, list(t = 3, Linf = 5, K = 2, t0 = 1))

您可以在stat_function()中使用此功能,如下所示:

g + stat_function(fun = function(x) do.call(LVB, c(list(x), parms)), color = "blue") 

或者,您也可以更改功能定义:

LVB_list <- function(t, parms) {
  parms$Linf*(1-exp(-parms$K*(t-parms$t0)))
}
g + stat_function(fun = function(x) LVB_list(x, parms), color = "blue")