purrr :: partial()的函数何时相同?

时间:2019-11-01 08:14:32

标签: r purrr

我有以下代码,我不知道为什么这些功能不同以及它们在何处不同:

add <- function(x, y) {
  x + y
}

add1 <- purrr::partial(add, x = 1)
add2 <- purrr::partial(add, x = 1)

identical(add1, add2)
#> [1] FALSE

我比较了它们的属性,实体和形式以及论点,它们都是平等的(显然)。我还将.env中的purrr::partial()参数设置为rlang::empty_env(),但没有帮助。

str(add1)
#> function (...)  
#>  - attr(*, "class")= chr [1:2] "purrr_function_partial" "function"
#>  - attr(*, "body")= language ~(function (x, y)  { ...
#>   ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
#>  - attr(*, "fn")= symbol add
str(add2)
#> function (...)  
#>  - attr(*, "class")= chr [1:2] "purrr_function_partial" "function"
#>  - attr(*, "body")= language ~(function (x, y)  { ...
#>   ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
#>  - attr(*, "fn")= symbol add
purrr::map2(attributes(add1), attributes(add2), identical)
#> $class
#> [1] TRUE
#> 
#> $body
#> [1] TRUE
#> 
#> $fn
#> [1] TRUE
purrr::map2(body(add1), body(add2), identical)
#> [[1]]
#> [1] TRUE
#> 
#> [[2]]
#> [1] TRUE
#> 
#> [[3]]
#> [1] TRUE

identical(args(add1), args(add2))
#> [1] TRUE
identical(formals(add1), formals(add2))
#> [1] TRUE

reprex package(v0.3.0)于2019-11-01创建

1 个答案:

答案 0 :(得分:3)

这些功能的环境不同:

identical(environment(add1), environment(add2))
#> [1] FALSE
identical(add1, add2, ignore.environment = TRUE)
#> [1] TRUE

我不确定如何将两个环境视为相同:

e1 <- new.env(parent = emptyenv())
e2 <- new.env(parent = emptyenv())
identical(e1, e2)
#> [1] FALSE

reprex package(v0.3.0)于2019-11-01创建