gpt4 book ai didi

r - purrr pmap 函数参数

转载 作者:行者123 更新时间:2023-12-04 07:54:12 25 4
gpt4 key购买 nike

使用 *apply 进行函数式编程或 purrr是我的面包和黄油但我不明白如何pmap处理函数参数。

  • 我可以用他们对应的变量名 (给定一个数据框作为输入)并且不必担心顺序。
  • 我可以更具体地使用它们作为命名参数
  • 我可以使用 类似 参数名称
  • 然而我不能使用完全不同的名称。

  • 我一直在查看多个类似的问题,但未能找到合适的答案
    A) 发生了什么和
    B)如何使用任意函数参数名称?
    # dummy data -----------------------------------------------------------------
    (iter_tibble <- tibble::tibble(a = 1:2,
    b = 3:4,
    c = 7:6))
    #> # A tibble: 2 x 3
    #> a b c
    #> <int> <int> <int>
    #> 1 1 3 7
    #> 2 2 4 6

    # pmap it --------------------------------------------------------------------
    # standard way
    purrr::pmap(iter_tibble, function(a, b, c) {
    paste(a, b, c)
    })
    #> [[1]]
    #> [1] "1 3 7"
    #>
    #> [[2]]
    #> [1] "2 4 6"

    # switch order
    # works and a maps to a, b to b etc
    purrr::pmap(iter_tibble, function(b, c, a) {
    paste(a, b, c)
    })
    #> [[1]]
    #> [1] "1 3 7"
    #>
    #> [[2]]
    #> [1] "2 4 6"

    # name arguments
    purrr::pmap(iter_tibble, function(a1 = a, b1 = b, c1 = c) {
    paste(a1, b1, c1)
    })
    #> [[1]]
    #> [1] "1 3 7"
    #>
    #> [[2]]
    #> [1] "2 4 6"

    # name arguments and switch order
    purrr::pmap(iter_tibble, function(b1 = b, c1 = c, asterix = a) {
    paste(b1, asterix, c1)
    })
    #> [[1]]
    #> [1] "3 1 7"
    #>
    #> [[2]]
    #> [1] "4 2 6"

    # but when using a different initial letter
    # ERROR
    purrr::pmap(iter_tibble,
    purrr::safely(
    function(b1 = b, c1 = c, obelix = a) {
    paste(b1, obelix, c1)
    }
    ))[1]
    #> [[1]]
    #> [[1]]$result
    #> NULL
    #>
    #> [[1]]$error
    #> <simpleError in .f(...): unused argument (a = 1)>
    这种行为与在常规 R 函数中调用参数的方式完全不同,在常规 R 函数中,可以使用缩写(但不好的做法)但不能进行扩展。
    # regular function usage -----------------------------------------------------
    # abbrevate arguments - no problem
    sample(1:4, s = 5, repla = TRUE)
    #> [1] 1 3 4 3 1

    # extend arguments? nope
    sample(1:4, size = 5, replaceeeee = TRUE)
    #> Error in sample(1:4, size = 5, replaceeeee = TRUE): unused argument (replaceeeee = TRUE)
    我的猜测是答案是关于 pmap调用 C 而不是 R 中发生的事情。

    最佳答案

    这里的误解是您的第 3 和第 4 个选项没有“命名参数”而是默认参数值。您正在向 .f 提供函数定义pmap 的论点,而不是函数调用。pmap正在以与基础 R 相同的方式进行部分参数匹配。打开 options(warnPartialMatchArgs = TRUE) 可能会更清楚.在这里,我将采用您的第三个示例,将函数定义分解以使正在发生的事情更清楚:

    iter_tibble <- tibble::tibble(
    a = 1:2,
    b = 3:4,
    c = 7:6
    )

    f3 <- function(a1 = a, b1 = b, c1 = c) {
    paste(a1, b1, c1)
    }

    purrr::pmap(iter_tibble, f3)
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'a' to 'a1'
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'b' to 'b1'
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'c' to 'c1'
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'a' to 'a1'
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'b' to 'b1'
    #> Warning in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], ...):
    #> partial argument match of 'c' to 'c1'
    #> [[1]]
    #> [1] "1 3 7"
    #>
    #> [[2]]
    #> [1] "2 4 6"
    这与您描述的常规 R 函数的情况完全相同,其中提供的命名参数可以是函数参数的缩写。换句话说,对于表格的第一行, pmap基本构造调用 f3(a = 1, b = 3, c = 7) . a , b , 和 c来自列名,值来自行。
    在尝试评估此调用时,我们看到函数 f3没有参数 a , 但它有一个参数 a1 .所以命名参数 a = 1在通话中与 a1 部分匹配在函数定义中。这就是输出中描述的部分匹配警告。没有“扩展”发生。事实上,论点 a1默认值为 a在这里完全无关紧要。
    如果要调用函数并将 tibble 中的值传递给不同命名的参数,请使用围绕它的包装器来更改接口(interface)。您可以使用单独的命名函数或(很常见)使用 ~匿名函数语法。使用你的第五个例子:
    iter_tibble <- tibble::tibble(
    a = 1:2,
    b = 3:4,
    c = 7:6
    )

    f5 <- function(b1, obelix, c1) {
    paste(b1, obelix, c1)
    }

    f5_wrapper <- function(a, b, c) {
    f5(b1 = b, obelix = a, c1 = c)
    }

    purrr::pmap(iter_tibble, f5_wrapper)
    #> [[1]]
    #> [1] "3 1 7"
    #>
    #> [[2]]
    #> [1] "4 2 6"
    purrr::pmap(iter_tibble, ~ f5(b1 = ..2, obelix = ..1, c1 = ..3))
    #> [[1]]
    #> [1] "3 1 7"
    #>
    #> [[2]]
    #> [1] "4 2 6"

    关于r - purrr pmap 函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66791203/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com