将参数传递给函数,以便使用ggplot stat_function进行绘图

时间:2014-01-09 20:37:11

标签: r ggplot2 environment

我有一个函数和一个参数列表。

F <- function(a,b,...) {a^b+b/a}
L <- list("a" = 5, "b" = 2, "c" = 0)

我想用一个未知的x(或“x”)替换其中一个参数(“a”,“b”或“c”)并用ggplot的stat_function替换。

这些计算是闪亮应用程序的一部分,用户将1)从下拉列表中选择一个参数,比如说“a”,是未知的,2)使用滑块选择其他参数的值。 L中的数字5,2,0是在用户交互之前使用的默认参数值。有几个这样的功能。这里参数列表L具有未在F中使用的元素。

我已经坚持了这么久,以至于我不能再思考了。在我试过的很多事情中,有一个:

# select a parameter to vary:
Y <- "a"
f1 <- function(f = F, l = L, y = Y, x, ...){
  l[y] <- x # replace "a" with x
  do.call(f, l, ...)
}

# make a stat_function ggplot:
library("ggplot2")
df <- data.frame(x = c(0,10))
p <- ggplot(df, aes(x))
p <- p + stat_function(fun = f1)
print(p)

这会返回以下错误:

Error in (function (f = F, l = L, y = Y, x, ...)  : 
  argument "x" is missing, with no default
Error in as.environment(where) : 'where' is missing

我尝试了几种变体,包括:设置l [y]&lt; - “x”并使用aes_string而不是aes。我也试过围绕x的反引号。我已经阅读了有关环境的文档,所以我尝试定义一个环境,包装x以及eval周围的所有内容或引用。我甚至尝试过伏都教。我已经不知道我花了多少时间在这上面。建议阅读手册或没有解释的提示会杀了我。 8-)如果我的问题不清楚,请告诉我,我会澄清。谢谢!

1 个答案:

答案 0 :(得分:2)

如果我理解,拥有一个多参数函数,你想要引入一个部分函数,​​你改变一个参数并修复其他参数。试试这个例子:

F <- function(a,b,...) {a^b+b/a}
L <- list("a" = 5, "b" = 2, "c" = 0)

f.partial <- function( var = "a",params=L){
  params[[var]]=as.name("x")
  function(x)do.call(F,params)
}

我们可以测试一下这个例子:

## vary a
f.partial("a")(1)
[1] 3
> F(1,b=L$b)
[1] 3
## vary b 
> f.partial("b")(1)
[1] 5.2
> F(1,a=L$a)
[1] 5.2

使用ggplot2进行测试:

library("ggplot2")
df <- data.frame(x = seq(0,1,0.1))
ggplot(df, aes(x)) +
  stat_function(fun = f.partial("a"),col='blue') +
  stat_function(fun = f.partial("b"),col='red')

enter image description here