【问题标题】:R: Use function arguments as names for list sub elementsR:使用函数参数作为列表子元素的名称
【发布时间】:2013-12-12 14:03:17
【问题描述】:

这是我正在尝试做的一个简化示例

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 方面并没有我想象的那么好。

【问题讨论】:

    标签: r list function names


    【解决方案1】:

    使用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() 调用中,但这可能代码过于繁琐而无法阅读

    【讨论】:

    • +1,为了学习方便,请问您在list()调用中提供setNames的代码吗?我玩弄了它,但我想我今晚一定要特别密集。​​
    • mylist &lt;- list(sums = setNames(c(sum(a), sum(b)), nms), products = setNames(c(prod(a), prod(b)), nms))