在R中使用函数为DataFrame添加列失败,求助解决方案
解决R语言函数中添加DataFrame新列不生效的问题
问题原因
你的函数中修改的是传入DataFrame的副本,而非原对象。R语言默认采用按值传递的方式处理函数参数,函数内部对参数的修改只会作用于局部副本,不会影响外部的原DataFrame。
解决方案
推荐使用以下两种规范的方式解决:
方法1:让函数返回修改后的DataFrame(最推荐)
修改函数,使其返回处理后的DataFrame,调用时将结果重新赋值给原变量:
year <- c(2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020) drugType <- c('drug1', 'drug1', 'drug1', 'drug1', 'drug2', 'drug2', 'drug2', 'drug2', 'drug3', 'drug3', 'drug3', 'drug3', 'drug4', 'drug4', 'drug4', 'drug4') total <- c(21, 18, 17, 10, 1, 1, 3, 4, 192, 242, 111, 234, 34, 26, 36, 17) perCapitaRate <- c(1.4, 4.3, 3.4, 3.0, 23.0, 3.3, 3.4, 3.5, 3.6, 45.4, 4.4, 4.5, 23.6, 34.7, 22.3, 2.0) drugDeathsByYr <- data.frame(year, drugType, total, perCapitaRate) concat_fields <- function(df) { df$year_drug <- paste(df$year, df$drugType, sep="_") df # 返回修改后的DataFrame,等价于return(df) } # 重新赋值给原变量,完成更新 drugDeathsByYr <- concat_fields(drugDeathsByYr)
方法2:使用引用修改(不推荐,易引发副作用)
如果需要直接修改原对象,可以通过操作父环境变量或使用data.table的引用特性实现,但这种方式会产生副作用,不利于代码维护:
方式2.1:操作父环境变量
concat_fields <- function(df_name) { # 传入变量名字符串,从父环境获取并修改 df <- get(df_name, envir = parent.frame()) df$year_drug <- paste(df$year, df$drugType, sep="_") assign(df_name, df, envir = parent.frame()) } # 调用时传入变量名的字符串 concat_fields("drugDeathsByYr")
方式2.2:使用data.table的引用修改
library(data.table) # 将data.frame转换为data.table drugDeathsByYr <- as.data.table(drugDeathsByYr) concat_fields <- function(dt) { # data.table的:=操作符会直接修改原对象 dt[, year_drug := paste(year, drugType, sep="_")] } concat_fields(drugDeathsByYr)
总结
优先选择方法1,它符合R的函数式编程理念,代码逻辑清晰,避免了不必要的副作用,更容易调试和维护。
内容的提问来源于stack exchange,提问作者DiamondJoe12
相关产品推荐
相关产品推荐

