2015-12-03 43 views
0

具有以下功能:呼叫從給定函數向量R中的函數

setTypes <- function(df2, ...) { 
    fns <- as.list(substitute(list(...))) 
    for(i in 1:length(df2)) { 
     if(fns[i] == '') { 
      next 
     } 
     df2[i,] <- fns[i](df2[i,]) 
    } 
    return(df2) 
} 

要做到這一點:

test<-setTypes(sls,c('','as.Date','','','as.numeric','as.numeric')) 

的想法是改變類型的字段的數據而不必爲每個字段執行sls$field <- as.numeric(sls$field)

我寫一個函數像這樣的工作:

fn <- function(t) { 
    return(t("55.55000")) 
} 

和輸出是這樣的:

> fn(as.numeric) 
[1] 55.55 
然而

,我想不通爲什麼要麼做可變長度參數作爲列表並將其稱爲list[index](input)不起作用。甚至路過的功能的載體像c(as.Date, as.numeric, as.character)和做c[1]('2015-10-10') # as.Date('2015-10-10')

我收到了錯誤的企圖,將非功能'。我一直在使用call也試過,但無濟於事。幫幫我?

+0

我很想說,這是[this](http://stackoverflow.com/q/7680959/324364)問題的重複... – joran

+0

由於你的函數列表是一個字符列表,你會得到這個錯誤。跳過'或使用do.call – nist

回答

0

的問題是,class(c[1])是一個列表使用c[[1]]代替

示例代碼

v <- c(as.numeric,as.character) 
v[[1]]("1") 
v[[2]](1) 

編輯 你的榜樣應該是:

setTypes <- function(df2, ...) { 
    fns <- list(...) 
    for(i in 1:NCOL(df2)) { 
    if(is.function(fns[[i]])) { 
     df2[,i] <- fns[[i]](df2[,i]) 
    } 
    } 
    return(df2) 
} 

df <- data.frame(v1 = c(1,2), v2 = c("1","2")) 
setTypes(df,as.character,'',as.numeric)