为何purrr::reduce(full_join())无法运行?解析写法差异
关于purrr::reduce中full_join与full_join()的核心语法差异
在使用purrr::reduce合并列表内的数据集时,遇到了以下语法差异问题:
复现代码
library(dplyr) library(purrr) # 构建包含10份mtcars的列表 a <- list() for(i in 1:10) a[[i]] <- mtcars # 可正常运行的写法 reduce(a, full_join) reduce(a, ~full_join(.x, .y)) reduce(a, \(x,y) full_join(x, y)) # 报错的写法 reduce(a, full_join())
报错信息
> reduce(a, full_join()) Error in UseMethod("full_join") : no applicable method for 'full_join' applied to an object of class "NULL"
核心区别解析
full_join:传递函数对象reduce的设计逻辑是接收一个二元函数(能接收两个输入参数并返回合并结果)。直接传入full_join时,reduce会自动将列表中的元素依次作为full_join的.x和.y参数传入,完成累积合并,这是reduce的标准用法——传递函数本身而非执行结果。full_join():执行函数并返回结果
当你写full_join()时,R会立即执行这个函数调用,但此时没有传入任何必要的数据集参数,full_join默认的.x和.y为NULL,因此直接触发"无适用于NULL对象的方法"的错误。即便传入了参数,full_join()返回的是合并后的数据集而非函数本身,reduce无法用一个数据集来处理列表元素,同样会报错。
简言之,reduce需要的是用于处理元素的函数工具,而full_join()给出的是函数运行后的具体结果,这就是两者的核心差异。
内容的提问来源于stack exchange,提问作者Giulio Centorame
相关产品推荐
相关产品推荐

