2013-04-20 56 views
1

我試圖根據輸入動態命名數據框架的輸出。根據輸入動態更改列名稱

get.max2 <- function(data = NULL, column) 
{ 
    #require(qdap) 
    col <- eval(substitute(column), data) 
    max <- max(eval(substitute(column), data)) 
    name <- lookup(col, max, rownames(data)) 
    name <- name[!is.na(name)] 
    #title <- do.call('paste', list(paste(match.call()[1]))) 
    df <- data.frame(name = name, title = max(col)) 
    print(df) 
} 

目前,輸出看起來是這樣的:

get.max2(mtcars, mpg) 

     name title 
Volvo 142E 33.9 

不過,我希望它看起來像這樣:

get.max2(mtcars, mpg) 

     name mpg 
Volvo 142E 33.9 

我認爲答案有事情做與比賽。 call/do.call,但是當我使用這些函數時,我的知識充其量是模糊的。任何人都知道這是否可能?

感謝您的幫助!

回答

1

你是title=..聲明是almsot那裏。

要改用:

title = paste(match.call()[-(1:2)], collapse=" ") 
# the collapse argument is optional, it's not clear 
# how you would like to handle multiple arguments 

注意的兩個主要來自你有什麼不同之處:

  1. 使用[-(1:2)]代替[1]match.call()中的元素是您不想要的函數名稱。或者,如果您只想要第二個參數,則可以使用match.call()[3]
  2. 在這種情況下,不需要do.call(.)paste工作得很好。
0

您正在尋找類似的產品如?deparse?substitute

variableName <- function(x) { 
    return(deparse(substitute(x))) 
} 

variableName(title) 
# [1] "title" 

variableName(mpg) 
# [1] "mpg" 
0

謝謝大家的幫忙!我發現的另一個解決方法是在處理後重命名數據框。

get.max2 <- function(data = NULL, column) 
{ 
    #require(qdap) 
    #require(gdata) 
    col <- eval(substitute(column), data) 
    max <- max(eval(substitute(column), data)) 
    name <- lookup(col, max, rownames(data)) 
    name <- name[!is.na(name)] 
    df <- data.frame(name = name, title = max(col)) 
    title2 <- do.call('paste', list(paste(match.call()[3]))) 
    df <- rename.vars(df, 'title', title2, info = F) 
    return(df) 
} 

將返回:

get.max2(mtcars, mpg) 

     name mpg 
Volvo 142E 33.9