2015-12-03 44 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)