2017-04-13 208 views
0

我想使用...將參數傳遞到不同函數中的ggplot。例如:使用...函數參數作爲另一個函數的輸入

dat <- data.frame(x = c(1, 2, 3), y = c(1, 2, 3)) 

f <- function(dat) { 
    ylimits = c(min(dat$x, dat$y), max(dat$x, dat$y)) 

    g(dat, ylim = ylimits) 
} 

g <- function(dat, ...) { 
args <- eval(substitute(alist(...))) 

ggplot(dat, aes(x = x, y = y)) + geom_point() + coord_cartesian(ylim = args[['ylim']]) 
} 

f(dat) 

我試圖使用eval(參數[「ylim」]),報價的各種組合/ deparse /替代品,但我一直沒能得到它的正確評價。

+2

爲什麼不乾脆'args < - list(...)'?這對我行得通。 – BrodieG

+0

谷歌的'省略號' –

回答

0

與前一功能的環境不與對象一起傳遞的,所以如果你保存的呼叫,然後嘗試對其進行評估,將無法在g表達找到ylimits,僅在f存在環境。

一種選擇是使用lazyeval包,但它目前正在贊成rlang,其dots_list會做的伎倆很好地爲您棄用:

library(ggplot2) 

dat <- data.frame(x = c(1, 2, 3), y = c(1, 2, 3)) 

f <- function(dat) { 
    ylimits = c(min(dat$x, dat$y), max(dat$x, dat$y)) 

    g(dat, ylim = ylimits) 
} 

g <- function(dat, ...) { 
    args <- rlang::dots_list(...) 

    ggplot(dat, aes(x = x, y = y)) + geom_point() + coord_cartesian(ylim = eval(args[['ylim']])) 
} 

f(dat) 

相關問題