获取分配给R中变量的函数名称

时间:2016-03-09 07:54:07

标签: r higher-order-functions internals

我有一个与this one类似的问题,但更为特殊。

请考虑以下示例代码:

fun1 <- mean
fun2 <- max
fun3 <- median

现在我想将分配给变量的函数名称作为charachter s。

虽然我理解this is not possible in general,但上述情况似乎有点特别:

l <- list(fun1 = fun1, fun2 = fun2, fun3 = fun3)
l
$fun1
function (x, ...)
UseMethod("mean")
<bytecode: 0x2793818>
<environment: namespace:base>
$fun2
function (..., na.rm = FALSE)  .Primitive("max")
$fun3
function (x, na.rm = FALSE)
UseMethod("median")
<bytecode: 0x28382c8>
<environment: namespace:stats>

因此print(funX)的输出包含分配给funX的函数的名称。

如何将此信息提取到character向量中?

2 个答案:

答案 0 :(得分:1)

findGeneric用于S3泛型:

fun1 <- mean

utils:::findGeneric("fun1", parent.frame())
#[1] "mean"

对于原始函数,您可以解析函数体:

fun2 <- max
is.primitive(fun2)
#[1] TRUE

body <- deparse(fun2)
m <- gregexpr('(?<=\\.Primitive\\(\\").*(?=\\")', body, perl = TRUE)
regmatches(body, m)[[1]]
#[1] "max"

答案 1 :(得分:0)

到目前为止,我能想出的最好的方法是解析print输出:

get_fun <- function(fun){
             lines <- capture.output(print(fun))
             pat <- "UseMethod|Primitive"
             index <- grep(pat, lines)
             line <- lines[index]
             pat <- paste0(".*(", pat, ")")
             chunk <- sub(pat, "", line)
             words <- strsplit(chunk, "\"")[[1]]
             return(words[2])
           }
sapply(l, get_fun)
    fun1     fun2     fun3
  "mean"    "max" "median"

但必须有一种更直接的方式。 毕竟,这些名称首先会在print输出中显示。

<强> 编辑: 基于Roland&#39; answer,我能够将上述函数定义简化为以下内容:

get_fun <- function(fun){
             fun <- deparse(fun)
             chunk <- tail(fun, 1)
             words <- strsplit(chunk, "\"")[[1]]
             return(words[2])
           }

我仍然希望有一个更直接/更健壮的解决方案(作为一个更高阶的函数,可能会返回"fun",因为真正的基础函数无法确定/不存在。)

相关问题