【发布时间】:2018-02-26 00:41:55
【问题描述】:
我来自 Stata,需要在 R 中为特定项目做一些工作。不幸的是,当我尝试在函数内的数据框中引用名称向量时,我在函数式编程方面没有取得多大成功。
我编写了一个函数,该函数将 (1) 在我的数据集中创建一个虚拟对象以判断该值是否缺失,然后 (2) 使用 dplyr 和lazyeval(如下)将 NA 转换为零。我无法在第二个函数中将变量名向量传递给该函数。
执行数据修改的工作函数:
dumfrmna <- function(dset, varn) {
expr <- enquo(varn)
x <- dset %>% summarise(sum(is.na(!!expr)))
if(x > 0) {
varname <- paste0(quo_name(expr), "_mis", sep = "")
dset <- mutate(dset, !!varname := is.na(!!expr),
!!expr = ifelse(is.na(!!expr), 0, !!expr))
}
return(dset)
}
第二个未能将字符名称传递给工作函数的函数:
misdum <- function(dset, vlist = character(), type = "exclude") {
#Err messages
if(!(is.vector(vlist) & is.character(vlist))) stop("vlist must be a character vector of variable names")
if(!((type == "include") | (type == "exclude"))) stop("type must take either \"include\" or \"exclude\"")
if(type == "exclude" & length(vlist) > 0 & all(vlist %in% names(dset))) stop("vlist contains variables not in dset")
if(length(vlist) == 0 & type == "include") {
stop("If type == include, vlist must be specified")
}
# Create list of included vars
else if(length(vlist) == 0 & type == "exclude") {
vname <- colnames(dset)
}
else if(length(vlist) > 0 & type == "include") {
vname <- vlist
}
else if(length(vlist) > 0 & type == "exclude") {
vname <- names(dest) %>%
setdiff(vlist)
}
#Create missing dummy
dset <- sapply(vname, function(x) dumfrmna(dset, x))
return(dset)
}
此外,当我尝试将变量名称向量应用于 R 中的函数时,这会失败。我尝试使用各种策略,如 noquote()、as.name()、parse(eval()) 来修改第二个函数中 sapply 中的列名向量,但这只是在第一个函数中的条件下中断。反正有没有去掉那个向量名称的引号?
这段代码在 R 中应该如何构造?
【问题讨论】: