предаване на аргументи за функция с оглед на чертане с 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. Прочетох документацията за среди, така че се опитах да дефинирам среда, обвивам x и почти всичко около eval или quote. Дори съм пробвал вуду. Изгубих броя колко часа съм прекарал в това. Едно предложение да прочета ръководството или намек без обяснение ще ме убие. 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
Това напълно проработи. Успях да го накарам да работи и в shiny. Благодаря за бързия и изчерпателен отговор. Само да имах разума да попитам преди 3 дни. О, добре. Едно нещо, което ще премахна тук, е използването на as.name(). Благодаря! - person PatrickT; 10.01.2014
comment
@PatrickT Не. По-добре да попитате след 3 дни, иначе няма да оцените (както трябва да бъде) отговора :) - person agstudy; 10.01.2014