我有以下代码,我不知道为什么这些功能不同以及它们在何处不同:
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创建
答案 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创建