передача аргументов в функцию с целью построения графика с помощью 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) выбирает параметр из раскрывающегося списка, скажем, «а», чтобы быть неизвестным, и 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. Я прочитал документацию об средах, поэтому я попытался определить среду, обернуть x и почти все, что связано с eval или кавычками. Я даже пробовал вуду. Я уже сбился со счета, сколько часов я потратил на это. Предложение прочитать инструкцию или подсказка без объяснения меня убьет. 8-) Если мой вопрос непонятен, пожалуйста, дайте мне знать, и я уточню. Спасибо!


person PatrickT    schedule 09.01.2014    source источник


Ответы (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')

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

person agstudy    schedule 09.01.2014
comment
Это полностью сработало. Мне также удалось заставить его работать в блестящем. Спасибо за быстрый и исчерпывающий ответ. Если бы я только имел смысл спросить 3 дня назад. Ну что ж. Одна вещь, которую я уберу здесь, это использование as.name(). Спасибо! - person PatrickT; 10.01.2014
comment
@PatrickT Нет. Лучше спросить через 3 дня, иначе вы не оцените (как и должно быть) ответ :) - person agstudy; 10.01.2014