具有以下功能:
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')
我收到错误&#39;尝试应用非功能&#39; ..我也尝试使用call
但无济于事。帮助
答案 0 :(得分: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)