R语言 用匿名函数替换字符向量的元素不会返回完整向量

mnemlml8  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(135)

我对以下行为感到困惑:

y <- letters |>
  (\(x) x[stringr::str_which(x, "a|e")] <- c("1", "2"))()

返回[1] "1" "2"
然而,我希望这个函数返回字母的完整向量,只是替换了a和e。
这是怎么回事?
注意:这可能看起来像是一种过于复杂的实现方式,但我坚持采用一个真实的的字符向量,检测遵循特定模式的元素,然后以向量化的方式将元素替换为不同的元素。
所以在这个例子a <- c("Q1", "Q6", "Q6")中,我想用“a”替换第一个出现的“Q6”,用“B”替换第二个。

sdnqo3pr

sdnqo3pr1#

函数的返回值是函数内部执行的最后一个表达式的值。
你的函数只包含一个表达式:子集赋值,R将其视为对函数[<-的调用。这就是所谓的 replacement function,所有的replacement function都会返回传递给它的值,即c("1", "2")在你的情况下。
这就是匿名函数的值。
要返回整个vector,您需要使该vector成为函数的最后一个表达式。您可以通过将向量变量作为最后一个表达式放入匿名函数来实现这一点:

y <- letters |>
  (\(x) {
    x[stringr::str_which(x, "a|e")] <- c("1", "2")
    x
  })()
vsaztqbk

vsaztqbk2#

R将返回最后一个求值表达式。
编辑:正如KonradRudolph正确指出的那样,在本例中实际上是赋值运算符<-
最后一个求值的表达式通常是函数中的最后一个项,或者如果函数已经使用return()提前终止,则可能是更早的项。
对比:

y <- letters |>
  (\(x) {
    x[stringr::str_which(x, "a|e")] <- c("1", "2")
    return(x)}
   )()

给予

> y
 [1] "1" "b" "c" "d" "2" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

就像把x加到末尾作为最后一个求值项一样:

y <- letters |> (\(x) {x[stringr::str_which(x, "a|e")] <- c("1", "2"); x})()

相关问题