Передача аргументов в функцию с целью построения графиков с помощью ggplot stat_function
У меня есть функция и список аргументов.
F <- function(a,b,...) {a^b+b/a}
L <- list("a" = 5, "b" = 2, "c" = 0)
Я хочу заменить один из аргументов ("a", "b" или "c") неизвестным x (или "x") и построить график с помощью stat_function ggplot.
Эти вычисления являются частью блестящего приложения, в котором пользователь 1) выберет параметр из выпадающего списка, скажем "a", чтобы быть неизвестным, и 2) использует ползунки для выбора значений других параметров. Числа 5, 2, 0 в L являются значениями параметров по умолчанию, которые должны использоваться до взаимодействия с пользователем. Есть несколько таких функций. Здесь в списке параметров 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] <- "x" и использование aes_string вместо aes. Я также пробовал кавычки вокруг х. Я прочитал документацию о средах, поэтому я попытался определить среду, заключив в нее x и почти все, что касается eval или quote. Я даже попробовал вуду. Я потерял счет, сколько часов я потратил на это. Предложение прочитать руководство или подсказку без объяснения убьет меня. 8-) Если мой вопрос неясен, пожалуйста, дайте мне знать, и я уточню. Спасибо!
1 ответ
Если я понимаю, имея функции с несколькими параметрами, вы хотите вызвать частичную функцию, где вы меняете один параметр и исправляете другие. Попробуйте это например:
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')