自定义R函数无法修改数据框列值,该如何正确编写?
问题原因分析
- R默认采用传值调用机制,你传入函数内部的
df$Date.of.Launch只是原列的副本,对副本的修改不会直接作用于全局环境中的原始数据框 - 你编写的两个函数都没有返回修改后的结果,也没有针对全局环境的变量做赋值操作:函数内部创建的
column属于局部变量,函数运行结束后就会被回收,自然不会对外部数据产生修改效果 - 第二种写法中的
transmute只会返回处理后的单列,没有将修改结果整合回原数据框,逻辑本身存在缺陷
正确写法参考
写法1:函数返回修改后的值,外部手动赋值(最推荐,无副作用)
f_change_date <- function(column) { as.Date(column) } # 外部将返回值赋值回原数据框 df$Date.of.Launch <- f_change_date(df$Date.of.Launch)
写法2:符合dplyr语法规范,返回完整修改后的数据框
library(dplyr) f_change_date <- function(df, col_name) { df %>% mutate({{col_name}} := as.Date({{col_name}})) } # 外部赋值覆盖原数据框 df <- f_change_date(df, Date.of.Launch)
写法3:直接在函数内修改全局数据框(不推荐,易造成变量污染)
f_change_date <- function(df_name, col_name) { df <- get(df_name, envir = .GlobalEnv) df[[col_name]] <- as.Date(df[[col_name]]) assign(df_name, df, envir = .GlobalEnv) } # 传入数据框名、列名的字符串形式即可生效 f_change_date("df", "Date.of.Launch")
内容的提问来源于stack exchange,提问作者purple1437
相关产品推荐
相关产品推荐

