我对以下行为感到困惑:
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”替换第二个。
2条答案
按热度按时间sdnqo3pr1#
函数的返回值是函数内部执行的最后一个表达式的值。
你的函数只包含一个表达式:子集赋值,R将其视为对函数
[<-
的调用。这就是所谓的 replacement function,所有的replacement function都会返回传递给它的值,即c("1", "2")
在你的情况下。这就是匿名函数的值。
要返回整个vector,您需要使该vector成为函数的最后一个表达式。您可以通过将向量变量作为最后一个表达式放入匿名函数来实现这一点:
vsaztqbk2#
R将返回最后一个求值表达式。
编辑:正如KonradRudolph正确指出的那样,在本例中实际上是赋值运算符
<-
最后一个求值的表达式通常是函数中的最后一个项,或者如果函数已经使用
return()
提前终止,则可能是更早的项。对比:
给予
就像把x加到末尾作为最后一个求值项一样: