2016-09-14 30 views
0

在使用...提供的参数列表中简单的功能,有可能是该功能查找名来自调用传递的对象的环境?如果是这样,怎么样?R:获得在'传递的参数名称...`

这出现在问题printing matrices and vectors side by side的上下文中,但可能更一般。

在这种情况下,参数...也可以包含字符串,但不需要名称。这里是我的MWE,我尝试使用deparse(substitute()),但无济于事。

test_names <- function(...) { 
    # get arguments 
    args <- list(...) 
    chars <- sapply(args, is.character) 
    names <- sapply(args, function(x) if(is.character(x)) " " else deparse(substitute(x))) 
    names 
} 

测试:

A = matrix(c(0.5, 1, 3, 0.75, 2.8, 4), nrow = 2) 
x = c(0.5, 3.7, 2.3) 
y = c(0.7, -1.2) 
b = A %*% x - y 

> test_names(A, " * ", x, " - ", y, " = ", b) 
[1] "X[[i]]" " "  "X[[i]]" " "  "X[[i]]" " "  "X[[i]]" 
> 

我期望这个输出是长度为7的特征向量:

[1] "A" " " "x" " " "y" " " "b" 

令人惊讶这里,结果是所有X[[i]],当有在任何地方都没有提到X

继@罗兰的答案,这似乎做什么,我想:

test_names2 <- function(...) { 
    argnames <- sys.call() 
    unlist(lapply(argnames[-1], as.character)) 
} 

> test_names2(A, " * ", x, " - ", y, " = ", b) 
[1] "A" " * " "x" " - " "y" " = " "b" 
+0

你得到那些从lapply。它不保留列表名称。 – Roland

+0

编辑显示所需的输出 – user101089

回答

1

使用sys.call

test_names <- function(...) { 
    argnames <- sys.call() 
    paste(lapply(argnames[-1], as.character), collapse = "") 
} 
#[1] "A * x - y = b" 
0

随着电子邮件列表描述(here)或者sys.call作为罗兰说或match.call能用于此。

相较于Roland的解决方案,与match.call的解决方案看起来像

f = function(...){ 
    return(match.call()) 
} 

d = f(x = 1, b = 5) 
d 
#f(x = 1, b = 5) 
as.list(d[-1]) 
#$x 
#[1] 1 
# 
#$b 
#[1] 5 

所以有点像这样使用它,因为第一个元素是函数本身的名称。

f = function(...){ 
    return(as.list(match.call())[-1]) 
} 

他们是相似的,但help page说:

sys.call()类似于[到match.call()],但不扩大 参数名称;

所以这里有一个区别。