2013-07-15 15 views
0

例如,在包ggplot2中,可以指定:ggplot2(data = mydataframe, aes(x=mycolumnname))。我期待着做這樣的事情,但我發現的唯一解決方案是使用帶括號的雙括號運算符。例如傳:在R中引用列而不加引號

a = myfunction(data = mydataframe, name = "mycolumnname") { 
    ... 
    col = mydataframe[[name]] 
    ... 
} 

我知道這是挑剔的,但有什麼辦法,我可以做到這一點,其中用戶不必輸入引號中的參數名稱?我一直在R函數中看到它。

+0

採取看看「plyr」中的點('?「。」')函數......但是會有惡魔......討論[她e](http://stackoverflow.com/questions/12850141/programming-safe-version-of-subset-to-evaluate-its-condition-while-called-from/12850252#12850252),而直接無關將會有一些光關於我說的惡魔。 – Justin

+0

如果你一直在R函數中看到它,沒有人阻止你自己查看這些函數的代碼。但是,我更願意通過使用字符作爲參數來避免未知的問題。 – Roland

回答

6

這樣的事情?

myfunction <- function(DF,col) { 
    DF[,as.character(substitute(col))] 
} 

dat <- data.frame(a=1:5,b=6:10) 

myfunction(dat,b) 
#[1] 6 7 8 9 10 

查看@Justin關於危險的評論。

6

另一種選擇是使用match.call

myfunction <- function(DF,col) { 
    pars <- as.list(match.call()[-1]) 
    DF[,as.character(pars$col)] 

    } 

然後,所有的論文語句是等同的:

myfunction(dat,b) 
    myfunction(dat,col=b) 
    myfunction(dat,col="b") 

當然,你可以概括這對所有的函數參數:

myfunction <- function(DF,col) { 
    pars <- as.list(match.call()[-1]) 
    get(as.character(pars$DF))[,as.character(pars$col)] 
    }