我有一个与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
向量中?
答案 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"
,因为真正的基础函数无法确定/不存在。)