以下是我正在尝试做的简化示例
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。
答案 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()
调用中,但这可能导致代码过于繁琐