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

标签 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。

最佳答案

使用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() 调用中,但这可能会使代码难以阅读

关于R:使用函数参数作为列表子元素的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20233841/

相关文章:

java - 如何迭代由 GSON 生成的 JAVA 对象列表

python - 打印列表列表中的第一项

c - 在终止程序之前存储值

r 根据值(不是行数或日期/时间变量)计算带窗口的滚动平均值

r - 获取给定字符串中的子字符串位置

r - t.test(y1, y2,paired=T) 是否意味着 var.equal=T?

r - 国家名称缩写

list - 如何从两个已经排序的列表中创建一个排序列表

python 崩溃并出现错误函数需要 2 个参数(给定 3 个参数)

scala - 标准运算符可以被元组化或柯里化(Currying)吗?