R语言循环无法更新dataframe,但控制台执行可正常生效
问题解决:R函数内无法更新全局DataFrame计数
问题根源
你的代码里,countDf是定义在全局环境的变量,但在countMatchingRows函数内部直接修改时,R会默认创建一个局部环境的countDf副本,函数结束后局部副本被销毁,全局的countDf完全没变化。而你在控制台直接执行修改语句时,是在全局环境操作,所以能生效。
三种可行解决方案
方案1:使用全局赋值符号<<-
直接修改函数内的赋值语句,强制在全局环境更新countDf:
countDf <- data.frame(row.names = twelve_special, count = rep(0,12)) countMatchingRows <- function(dataframe1, dataframe2) { for (i in 1:nrow(dataframe1)) { if (dataframe1[i,] < 0.05 && dataframe2[i,] < 0.05) { print("HERE") countDf[i,] <<- countDf[i,] + 1 # 用<<-替代=或<- } } } for (i in 1:num_runs) { countMatchingRows(dataframe_list_1[[i]], dataframe_list_2[[i]]) }
方案2:将countDf作为参数传入并返回(推荐,符合函数式编程)
避免依赖全局变量,把countDf传入函数,修改后返回,再更新全局的countDf:
countDf <- data.frame(row.names = twelve_special, count = rep(0,12)) countMatchingRows <- function(dataframe1, dataframe2, countDf) { for (i in 1:nrow(dataframe1)) { if (dataframe1[i,] < 0.05 && dataframe2[i,] < 0.05) { print("HERE") countDf[i,] <- countDf[i,] + 1 } } return(countDf) } for (i in 1:num_runs) { countDf <- countMatchingRows(dataframe_list_1[[i]], dataframe_list_2[[i]], countDf) }
方案3:向量化操作替代循环(更高效,R语言最佳实践)
R中循环效率较低,可通过向量化操作批量处理所有配对的DataFrame:
countDf <- data.frame(row.names = twelve_special, count = rep(0,12)) # 定义函数,单次计算符合条件的行的0/1计数向量 get_match_vector <- function(df1, df2) { as.integer(df1 < 0.05 & df2 < 0.05) } # 对所有配对的DataFrame应用函数,得到每个批次的计数列表 match_count_list <- Map(get_match_vector, dataframe_list_1, dataframe_list_2) # 将列表转为矩阵后按行求和,赋值给countDf countDf$count <- rowSums(do.call(rbind, match_count_list))
内容的提问来源于stack exchange,提问作者Liam Wilson
相关产品推荐
相关产品推荐

