我试图让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
但我希望能够存储我的&#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")
但是,无论我做什么,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)))
}
答案 0 :(得分:2)
这与stat_function()
无关,而与LVB()
本身无关。您已使用语法
LVB(t, Linf, K, t0)
你必须尊重这一点。如果你运行
LVB(t, parms)
该函数认为它应该parms
使用Linf
并将K
和t0
视为缺失,这就是您收到错误的原因。
您可以使用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")