R:使用函数参数作为列表子元素的名称

时间:2013-11-27 04:20:46

标签: r list function names

以下是我正在尝试做的简化示例

set.seed(1)
a <- rnorm(10)
b <- rnorm(10)

asdf<-function(vec1,vec2){
  mylist <- list(sums = c(vec1 = sum(a), vec2 = sum(b)),
                 products = c(vec1 = prod(a), vec2 = prod(b)))
  return(mylist)
}

asdf(a,b)

这是输出:

$sums
vec1     vec2 
1.322028 2.488450 
$products
vec1         vec2 
0.0026236813 0.0003054751 

列表元素的名称基于我在定义函数时指定的名称,而不是函数中使用的实际输入。总的来说,这是有道理的,但我想知道如何针对特定问题更改此行为

我想要的输出,给定输入ab将是

$sums
a        b 
1.322028 2.488450 

$products
a            b 
0.0026236813 0.0003054751 

无论输入是什么,都应该在输出中返回c(1,2,3,3,3,123)c(2,1,1,5,7,1)rnorm(10)rpois(10)

我知道在完成功能后如何重命名,但我希望命名发生 在功能内。我一直在寻找关于SO的其他一些问题,但是没有任何问题可以解决。

我尝试了一些没有成功的事情。

asdf<-function(vec1,vec2){
  name1<- deparse(substitute(vec1))
  name2<- deparse(substitute(vec2))
  mylist <- list(sums = c(name1 = sum(a), name2 = sum(b)),
                 products = c(name1 = prod(a), name2 = prod(b)))
  return(mylist)
}

asdf<-function(vec1,vec2){ 
  mylist <- list(sums = c(name1 = sum(a), name2 = sum(b)),
                 products = c(name1 = prod(a), name2 = prod(b)))
  assign(names(mylist(vec1,vec2)$sums,
         c(deparse(substitute(vec1)),deparse(substitute(vec2)))))
  return(mylist)
}

似乎我可能需要使用getassignmatch.call,但我不在这里。

我觉得有点像阅读其中一些帮助页面的傻瓜。如果我不太了解帮助页面,那么,我就不像我想象的那样擅长R。

1 个答案:

答案 0 :(得分:2)

使用substitute来捕获名称,然后使用setNames来设置名称。

asdf<-function(vec1,vec2){
  nms <- as.character(c(substitute(vec1), substitute(vec2)))

  mylist <- list(sums = c(vec1 = sum(a), vec2 = sum(b)),
                 products = c(vec1 = prod(a), vec2 = prod(b)))

  # return
  lapply(mylist, setNames, nms)
}

asdf(a,b)

您可以将setNames权限置于上方的list()调用中,但这可能导致代码过于繁琐