R 中 map() 中 if() 的奇怪行为

Strange behavior of if() inside map() in R

使用 map() 我写了一个简单的函数,它应该 return 'yes' 如果 x 是 1,'no' 如果 x 是 2,'maybe' 如果 x是 3.

map(
  .x = c(1,2,3),
  .f = function(x) {
    if (x==1) y= 'yes'
    if (x==2) y='no'
    if (x==3) y='maybe'})

我希望得到一个包含 'yes'、'no'、'maybe' 的列表,是的,我得到了:

[[1]]
NULL

[[2]]
NULL

[[3]]
[1] "maybe"

所以似乎每个 if() 都被评估,只有最后一个被 returned,当 x 为 1 或 2 时为 NULL。我的问题是为什么?我希望 if() 在全球环境中表现得像:

x = 1
    if (x==1) y='yes'
    if (x==2) y='no'
    if (x==3) y='maybe'})
y
[1] "yes"

您为 y 分配了 3 次新值。使用 else 使其成为一个表达式。

map(
  .x = c(1,2,3),
  .f = function(x) {
    if (x==1) y = 'yes'
    else if (x==2) y = 'no'
    else if (x==3) y = 'maybe'})

#[[1]]
#[1] "yes"
#
#[[2]]
#[1] "no"
#
#[[3]]
#[1] "maybe"

R 是一种 expressions-based 语言。表达式具有价值。 (几乎)一切都是表达。这意味着一切最终都有一个价值。 映射中的函数体最终只有一个值,最后一个 if-statement.

所以添加else,例如


map(
  .x = c(1, 2, 3),
  .f = function(x) {
    if (x == 1)
      y = 'yes'
    else if (x == 2)
      y = 'no'
    else if (x == 3)
      y = 'maybe'
  }
)