这是我正在尝试做的一个简化示例
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
列表元素的名称基于我在定义函数时指定的名称,而不是函数中使用的实际输入。一般来说,这是有道理的,但我想知道如何针对特定问题更改此行为
我想要的输出,给定输入 a
和 b
将是
$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)
}
看来我可能需要使用 get
或 assign
或 match.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/