无法通过自定义函数删除DataFrame的date列,求助解决办法
解决R函数修改数据框后原对象无变化的问题
问题原因
R默认是传值调用,你在函数里操作的fr只是原数据框的副本,修改副本不会影响全局环境里的原对象;而且你的函数没有返回修改后的结果,所以调用后原fr完全没变化。用subset()也是一样的道理——它会生成新的数据集,但你没把新结果赋值回原变量。
解决办法
方法1:让函数返回修改后的对象,重新赋值(推荐)
这是R里最规范的写法,函数专注于生成新数据,由你决定是否覆盖原变量:
nodates <- function(fr){ dplyr::select(fr, -date) } # 调用时把结果重新赋值给fr fr <- nodates(fr)
也可以显式用return(),效果一致:
nodates <- function(fr){ fr <- dplyr::select(fr, -c(date)) return(fr) } fr <- nodates(fr)
方法2:直接修改原对象(不推荐)
如果一定要让函数直接修改全局环境里的原对象,可以用assign()或者<<-,但这种写法会产生副作用,代码逻辑变复杂,后期维护容易出问题:
nodates <- function(){ # 直接操作全局环境的fr fr <<- dplyr::select(fr, -date) } # 调用后原fr会被修改 nodates()
或者更灵活地传入对象名:
nodates <- function(obj_name){ current_obj <- get(obj_name, envir = parent.frame()) updated_obj <- dplyr::select(current_obj, -date) assign(obj_name, updated_obj, envir = parent.frame()) } # 调用时传字符串形式的变量名 nodates("fr")
方法3:不用函数,直接操作
如果只是简单删除列,其实没必要写函数,直接用管道或者基础R语法即可:
# dplyr管道写法 fr <- fr %>% dplyr::select(-date) # 基础R写法 fr <- fr[, !names(fr) %in% "date"]
内容的提问来源于stack exchange,提问作者Edgy Weeyum
相关产品推荐
相关产品推荐

