为什么 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)
我不明白为什么 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)