有条件地将函数映射到列表中所有子列表的特定元素 - R

问题描述

任务:

  • 我想将带有 ifelse函数有条件地应用于 R 中命名的 list 中所有子列表中的特定元素。
  • 我想将此输出存储在命名的 list 中。
  • 另外,如何提取满足条件的子列表中的元素并存储在新的命名列表中?

列表是 ggplot2 块。

数据:

library(furrr)
library(data.table)

my_list <- list(ggplot_1 = ggplot_1,ggplot_2 = ggplot_2,ggplot_3 = ggplot_3)
my_names <- names(my_list)

str(my_list)
> list of 3
>  $ggplot_1 : list of 9
>   $data :'data.frame': 20 obs. of 10 variables:
    # Other sub-list elements...
>
>  $ggplot_2 : list of 9
>   $data :'data.frame': 0 obs. of 10 variables:
    # Other sub-list elements...
>
>  $ggplot_3 : list of 9
>   $data :'data.frame': 10 obs. of 10 variables:
    # Other sub-list elements...

单独进行以下工作:

ifelse(nrow(my_list$ggplot_1$data) != 0,TRUE,FALSE)
> TRUE
ifelse(nrow(my_list$ggplot_2$data) != 0,FALSE)
> FALSE

尝试:

# I have used mapping functions from the furrr package,# but this approach should be similar (although sequential) for purrr::map2/base::Map.

# Start multisession parallel backend
plan(multisession,workers = 2)

# Attempt to map a function conditionally through a list
future_map2(my_list,my_names,function(.x,.y) {
            ifelse(nrow(.x$.y$data) != 0,FALSE))
  })

解决方法

您不需要 map2,因为名称已经在您想要 map 的列表中。
ifelse 也不是必需的,因为 > 运算符已经返回一个布尔值。

library(purrr)
library(ggplot2)

my_list %>% map(~nrow(.x$data)!=0)


$ggplot_1
[1] TRUE

$ggplot_2
[1] TRUE

$ggplot_3
[1] FALSE

以上示例适用于 purrr,您只需将 map 替换为 future_map 即可将其转置为 furrr

,

我们可以使用 keepfilter list 元素`

purrr::keep(my_list,~ nrow(.x$data) > 0)

或者将 base RFilter 一起使用

Filter(function(x) nrow(x$data) > 0,my_list)