lift函数主要是作为函数的包装器/位置定位器,它通过将函数的定义参数的作用域从一种输入转化为另一种输入形式。例如lift_dl的意思是将函数参数的作用域的输入从...(dots)转化为列表输入。
lift(..f, ..., .unnamed = FALSE)
lift_dl(..f, ..., .unnamed = FALSE)
对于lift函数来说,lift_dl是最常用的变体,因此lift本体函数与变体lift_dl的含义相同(其他的大概变体意思差不多就不说了)
参数:
..f:是你想要转变输入域的函数对象。
.unnamed:逻辑值,默认为FALSE,如果为TRUE,返回后的函数接受输入(列表,向量)时将不会按照名称(name)赋予参数,而是按照输入位置分配参数
...:给..f输入的默认参数值。
后缀含义:
d代表dots(...), v代表vector(向量),l代表list(列表),dl的意思就是从dots(...)取参数传值给函数..f 变为从list(列表)中传值给函数..f
例:
list(c(1:100, NA, 1000)) %>% purrr::lift_dl(mean, na.rm = TRUE)()
将mean函数转化为能接收list的值的函数,并通过管道运算符传递。
个人想法:
仅就以这个函数的dl变体来讲,这个函数的效果和invoke差不多。
这行代码也可以达到同样的效果
但是一些情况下例如需要循环的时候,可能会碰到使用lift函数。
purrr::invoke(.f=mean,.x=list(c(1:100, NA, 1000),na.rm=TRUE))
后续补充:
回头来看,这个方法和invoke的已经彻底被Hadley弃用了,要完成将列表转为函数参数的逻辑,tidyverse回归了rlang包下的exec方法。这个函数比baseR的do.call更友好,并支持类似python的**kwargs语法