为什么 purrr::transpose 不能与管道运算符一起使用?

Why doesn't purrr::transpose work with the pipe operator?

我不明白为什么 purrr::transpose 在管道运算符之后发出错误。
purrr::map.

等其他函数并非如此

参见下面的示例:

library(purrr)
# Works
identical(mtcars %>% map(~{.x}), mtcars %>% purrr::map(~{.x}))
# [1] TRUE

# Works
mtcars %>% transpose

# Doesn't work
mtcars %>% purrr::transpose
#Error in .::purrr : unused argument (transpose)

可能是我误解了命名空间运算符,如果是的话请纠正我,但我认为这是原因。

我认为这是命名空间符号实际上充当中缀运算符的问题 ::。这意味着它尝试使用的函数调用是:

`::`(mtcars, purrr, transpose)

这里出现错误是因为命名空间中缀运算符只能接受两个参数:包名和包中的函数。

这不是用户所期望的,因为我们希望能够通过管道运算符使用来自外部命名空间的函数。这是因为代码对试图调用的函数是什么感到困惑,因此它找到了它可以找到的第一个函数(在本例中 ::)。

这个问题的解决方案是使用括号来注意 transpose 是函数或者 purrr::transpose 应该首先被计算。我们可以用下面的代码来做到这一点:

# purrr::transpose is the function
mtcars %>% purrr::transpose()

# Evaluate this block as the expression of the function
mtcars %>% (purrr::transpose)