2014-01-09 34 views
1

我有一個函數和一個參數列表。將參數傳遞給函數以便用ggplot繪圖stat_function

F <- function(a,b,...) {a^b+b/a} 
L <- list("a" = 5, "b" = 2, "c" = 0) 

我想更換一個未知的X的參數( 「A」, 「B」 或 「C」)一個(或 「X」)與情節與ggplot的stat_function。

這些計算是一個閃亮的應用程序的一部分,其中用戶將1)從下拉列表中選擇一個參數,稱爲「未知」,和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] < - 「X」並使用aes_string而不是aes。我也在x周圍嘗試了反引號。我已經閱讀了有關環境的文檔,所以我嘗試過定義一個環境,包裝x以及圍繞eval或引用的所有內容。我甚至嘗試過巫毒。我已經失去了在這個上花了多少小時的計數。沒有解釋的閱讀手冊或提示的建議會殺了我。 8-)如果我的問題不清楚,請讓我知道,我會澄清。謝謝!

回答

2

如果我明白,有一個多參數函數,你想引發一個部分函數,​​你改變一個參數並修復其他參數。與ggplot2

## 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 

測試:試試這個,例如:

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) 
} 

我們可以測試這個例如

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') 

enter image description here

+0

這完全奏效。我也設法讓它在閃亮的環境下工作。感謝您的快速和徹底的答覆。如果只有3天前我有問題的感覺。好吧。我要拿走的一件事就是使用'as.name()'。謝謝! – PatrickT

+1

@PatrickT號更好的問3天后,否則你不會欣賞(因爲它應該是)的答案:) – agstudy

+0

這裏是我正在使用你的代碼的工作的閃亮的應用程序:-)該應用程序是未完成。 https://gist.github.com/ptoche/8376799 Et merci encore ag! – PatrickT