1

所以在这里,当使用索引(“.y”)浏览列表时,我得到了 imap 错误。下面我已经让它与 map2 一起工作,但这很令人困惑,因为我制作 map2() 函数的方式与我认为 imap 会做的方式完全相同。但显然不是,否则它不会出错。

我很想尽可能好地理解 purrr 逻辑,有人能告诉我发生了什么吗?

library(purrr)

l1 <- list(a='a', b='b')



# single brackets -  'missing value where TRUE/FALSE needed'
imap(l1, ~{
  y1 <- names(l1)[.y]
  if(y1 == 'a') out1 <- TRUE
  if(y1 == 'b') out1 <- FALSE
  out
})
# double brackets -  subscript out of bounds
imap(l1, ~{
  y1 <- names(l1)[[.y]]
  if(y1 == 'a') out1 <- TRUE
  if(y1 == 'b') out1 <- FALSE
  out
})


# emulating what I think imap() does 
map2(l1, seq_along(l1), ~{
  y1 <- names(l1)[.y]
  if(y1 == 'a') out1 <- TRUE
  if(y1 == 'b') out1 <- FALSE
  out1
})
4

2 回答 2

1

如果列表中存在名称,则为列表.y的名称,而不是索引。所以,

names(l1)['a'] #returns
#[1] NA

这解释了'missing value where TRUE/FALSE needed'

names(l1)[['a']]

返回

名称错误(l1)[[“a”]]:下标超出范围

你需要的是——

purrr::imap(l1, ~{
  if(.y == 'a') out1 <- TRUE
  if(.y == 'b') out1 <- FALSE
  out1
})

#$a
#[1] TRUE

#$b
#[1] FALSE
于 2021-06-23T11:55:50.223 回答
1

也许你只需要

imap(l1, ~ if(.y == 'a')  TRUE else FALSE)

$a
[1] TRUE

$b
[1] FALSE
于 2021-06-23T11:59:01.037 回答