Передача аргументов в функцию с целью построения графиков с помощью 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')

введите описание изображения здесь

Другие вопросы по тегам