gpt4 book ai didi

r - 获取作为参数传递给函数的函数名称

转载 作者:行者123 更新时间:2023-12-03 20:29:22 24 4
gpt4 key购买 nike

背景

函数作为参数传递给函数。问题涉及:

  • 以字符串形式获取该函数的名称以方便后续操作
  • 在调用的包中定位该函数
  • 理解 :: ::: 电话

  • 例子

    功能 fun_tst执行函数 FUN在 x 上:
    fun_tst <- function(x = 1:100, FUN = mean) {
    return(FUN(x))
    }
    mean
    fun_tst()
    # [1] 50.5
    sum
    fun_tst(x = 1:1e3, FUN = sum)
    # [1] 500500

    问题
    fun_tst <- function(x = 1:100, FUN = mean) {
    msg <- paste("Executing function", FUN)
    print(msg)
    return(FUN(x))
    }


    fun_tst(x = 1:1e3, FUN = sum)

    Error in paste("Executing function", FUN) : cannot coerce type 'builtin' to vector of type 'character'



    尝试

    1)

    有趣的是, print可以处理 FUN对象但结果返回函数体。
    fun_tst <- function(x = 1:100, FUN = mean) {
    print(FUN)
    return(FUN(x))
    }


    fun_tst(x = 1:1e3, FUN = sum)

    function (..., na.rm = FALSE) .Primitive("sum") [1] 500500



    2) subsitute
    fun_tst <- function(x = 1:100, FUN = mean) {
    fun_name <- substitute(FUN)
    msg <- paste("Executing function", fun_name, collapse = " ")
    print(msg)
    return(FUN(x))
    }


    fun_tst(x = 1:1e3, FUN = sum)

    >> fun_tst(x = 1:1e3, FUN = sum)
    [1] "Executing function sum"
    [1] 500500

    几乎就在那里,但是当与 一起使用时,它看起来一团糟:: 如:
    >> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
    [1] "Executing function :: Executing function dplyr Executing function glimpse"
    int [1:1000] 1 2 3 4 5 6 7 8 9 10 ..

    预期结果
    fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
    # Executing function glimpse from package dplyr
    int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...

    fun_tst(x = 1:1e3, FUN = sum)
    # Executing function sum from package base

    最佳答案

    第二次尝试就快完成了(使用 substitute )。问题来自 R 转换的方式 language对象到字符:

    > as.character(substitute(dplyr::glimpse))
    [1] "::" "dplyr" "glimpse"

    鉴于此, paste 也就不足为奇了。把它弄成那样。我会通过分别处理这两种情况来解决这个问题:
    fun_tst <- function(x = 1:100, FUN = mean) {
    fun_name <- substitute(FUN)
    if (length(fun_name) == 1) {
    msg <- paste("Executing function", fun_name, "from package base")
    } else {
    msg <- paste("Executing function", fun_name[3], "from package", fun_name[2])
    }
    print(msg)
    return(FUN(x))
    }

    这适用于您的两个示例:
    > fun_tst(x = 1:1e3, FUN = sum)
    [1] "Executing function sum from package base"
    [1] 500500
    > fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
    [1] "Executing function glimpse from package dplyr"
    int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...

    但是,正如所写,它会认为全局环境中的所有函数都来自 base ,即使它们是用户定义的或通过 library 引入的称呼。如果这是您的用例,请不要明确说“来自包库”。

    关于r - 获取作为参数传递给函数的函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53046569/

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