R语言中使用purrr::map调用含dataframe参数的函数出错求助
问题:purrr::map调用自定义函数返回空NULL列表的原因
问题场景
你编写了将数据框行转换为字符向量的函数:
concatenateRow <- function(data, rownum){ as.character(data[rownum,]) }
并准备了如下数据框:
data <- structure(list(A = c("0", "0", "8", "0", "0", "0", "0.0", "0.0", "0", "0", "0"), B = c("45", "17", "39", "36", "29", "15", "38", "49", "40", "39", "44"), C = c("32", "28", "25", "50", "35", "27", "45", "60", "50", "52", "54"), D = c("28", "28", "44", "44", "41", "28", "60", "44", "45", "61", "45"), E = c("15", "9", "0", "30", "0", "21", "0", "0.0", "15", "10", "0")), row.names = c(NA, -11L), class = "data.frame")
尝试用purrr的map函数遍历行号调用该函数:
rownum <- (1:11) library(purrr) new.data <- map(rownum, concatenateRow(data))
单独调用concatenateRow(data, 1)可正常运行,但map执行后得到长度为11的NULL空列表。
出错原因
核心问题是**map的参数传递方式错误**:
map的第二个参数要求传入一个函数对象,但你直接执行了concatenateRow(data)——此时函数只接收了第一个参数data,第二个参数rownum缺失,函数执行后返回的是不符合要求的错误结果。map会把这个错误的执行结果当作“待调用的函数”去遍历rownum,最终每个迭代都返回NULL。
解决方法
有两种简单的修正方式:
1. 使用匿名函数传递参数
通过匿名函数把rownum的每个元素作为第二个参数传入自定义函数:
new.data <- map(rownum, function(x) concatenateRow(data, x))
2. 使用purrr::partial做参数部分绑定
利用partial固定函数的第一个参数data,生成只需要传入rownum的新函数:
library(purrr) concat_with_data <- partial(concatenateRow, data = data) new.data <- map(rownum, concat_with_data)
执行任意一种修正后的代码,new.data都会变成包含11个字符向量的列表,和单独调用函数的结果一致。
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

