2016-01-15 35 views
12

当我在管道步骤中使用嵌套函数时,执行顺序看起来不直观。在dplyr管道中执行嵌套函数的顺序

df <- data.frame(a = c(1,NA,2), b = c(NA, NA, 1)) 
df %>% is.na %>% colSums # Produce correct count of missing values 
df %>% colSums(is.na(.)) # Produce NA 

任何人都可以解释为什么在第三行嵌套函数不会产生正确的结果?

回答

14

这是因为.总是作为第一个参数传递给下面的函数。因此,在colSums的第二次尝试中,您假设您将is.na(.)作为第一个参数传递给colSums,但您实际上将其作为第二个参数传递,即na.rm参数。所以你的代码实际上看起来是df %>% colSums(x = ., na.rm = is.na(.))。您可以通过在函数周围使用{}来防止.作为第一个参数传递。 df %>% {colSums(is.na(.))}