我有一个函数和一个参数列表。
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-)如果我的问题不清楚,请告诉我,我会澄清。谢谢!
答案 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')