English · PDF 314
我们仍然可以在管道中使用它:
mtcars %>% show_missings() %>% mutate(mpg = ifelse(mpg < 20, NA, mpg)) %>% show_missings() #> 缺失值:0 #> 缺失值:18
函数的最后一个组成部分是它的环境。当你刚开始编写函数时,并不需要深入理解这一点。然而,对环境有一点了解很重要,因为它们对函数的工作方式至关重要。函数的环境控制着 R 如何查找与某个名称相关联的值。例如,看这个函数:
f <- function(x) { x + y }
在许多编程语言中,这会是一个错误,因为 y 没有在函数内部定义。在 R 中,这是有效的代码,因为 R 使用称为词法作用域的规则来查找与某个名称相关联的值。由于 y 没有在函数内部定义,R 会在函数被定义的环境中查找:
y <- 100 f(10) #> [1] 110 y <- 1000 f(10) #> [1] 1010
这种行为看起来像是产生 bug 的温床,确实你应该避免故意创建这样的函数,但总的来说它不会造成太多问题(尤其是如果你经常重启 R 以获得一个干净的状态)。
这种行为的好处在于,从语言的角度来看,它使 R 非常一致。每个名称都使用同一套规则进行查找。对于 f() 来说,这包括两个你可能没有预料到的行为:{ 和 +。这让你可以做一些“狡猾”的事情,比如: