r - 有没有办法在 purrr::map 中自动传播 NULL?

标签 r functional-programming tidyverse purrr

我有一些数据,其中一些被复制,一些没有。我只能适应 我的复制数据模型。

library(tidyverse)
d <- tribble(
  ~env, ~val,
  "A",  1,
  "A",  2,
  "B",  3
)

我正在使用 tidyr::nest()purrr::map() 函数来适应我的模型。 然而,在我用于 map() 的每个函数中,我都必须满足特殊的需求 我归档的一组特定数据不可建模的情况 通过以下方式的调用

map(col, function(elem){ if(!is.null(elem)) DO_STUFF(elem) else NULL})

过了一段时间,我成功地将这种行为提取为 purrr 风格的副词 函数接受另一个函数并将其包装,以便此行为 对于 NULL 元素是自动的:

maybe <- function(fun){
  function(val,...){ if(!is.null(val)) fun(val, ...) else NULL}
}

然而,这让我想知道:我是否在重复这样的行为 已经可以使用 tidyverse 函数存档?

额外问题:函数式编程中是否有一个词来表示像 maybe 这样的函数?


这是测试我的副词的示例:

简单模型:环境 A 中的数据的平均值,并且没有环境 A 中的数据的模型 环境B(因为数据是未复制的:)

modelFuns <- list(A = mean, B = NULL)

按环境对数据进行分组,并为每个组确定适当的模型

d <- d %>% group_by(env) %>% nest(.key = "data")
d %<>% mutate(model = modelFuns[env])
d

## # A tibble: 2 x 3
##   env   data             model 
##   <chr> <list>           <list>
## 1 A     <tibble [2 × 1]> <fn>  
## 2 B     <tibble [1 × 1]> <NULL>

执行建模:

d %<>% mutate(out = pmap(list(model, data), maybe(function(m,d) m(d$val))))
d

## # A tibble: 2 x 4
##   env   data             model  out      
##   <chr> <list>           <list> <list>   
## 1 A     <tibble [2 × 1]> <fn>   <dbl [1]>
## 2 B     <tibble [1 × 1]> <NULL> <NULL>

这相当于以下不使用我的maybe副词的代码:

d %<>% mutate(out = pmap(list(model, data), function(m,d){if(!is.null(m)) m(d$val) else NULL}))
d

## # A tibble: 2 x 4
##   env   data             model  out      
##   <chr> <list>           <list> <list>   
## 1 A     <tibble [2 × 1]> <fn>   <dbl [1]>
## 2 B     <tibble [1 × 1]> <NULL> <NULL>

可能有一个值或可能有 NULL 的事实传播到 我想要对下游建模结果做的一切,即 为什么副词maybe很有用。这样的东西已经存在了吗 在 tidyverse 中?

isModelNice <- function(val) val > 0
d %<>% mutate(nice = map(out, maybe(isModelNice)))
d

## # A tibble: 2 x 5
##   env   data             model  out       nice     
##   <chr> <list>           <list> <list>    <list>   
## 1 A     <tibble [2 × 1]> <fn>   <dbl [1]> <lgl [1]>
## 2 B     <tibble [1 × 1]> <NULL> <NULL>    <NULL>

最佳答案

你可以使用purrr::possible()吗?

library(tidyverse)

d <- tribble(
  ~env, ~val,
  "A",  1,
  "A",  2,
  "B",  3
)

modelFuns <- list(A = mean, B = NULL)

d %>% group_by(env) %>% 
  nest(.key = "data") %>% 
  mutate(model = modelFuns[env]) %>% 
  mutate(out = pmap(list(model, data), possibly(function(m,d) m(d$val), NULL)))

关于r - 有没有办法在 purrr::map 中自动传播 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058090/

相关文章:

functional-programming - SML Ml 编程函数是具有 bool 条件的旧日期

haskell - 高阶函数的计算复杂性?

r - 从数据框列表中获取列对

r - 使用 slider 绘制 3d 图形以控制绘制的点数

javascript - 在 JavaScript 函数中运行而不每次都重新声明它

r - 当列为 num 时,列被错误标记为 int

r - 如何将数据框中的列转换为行名

r - 使用 tidyverse 在组内将长转为宽

r - 如何在r中找到不同日期的最小值

r - 使用 biomaRt 查找转录起始位点