【发布时间】: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
列表元素的名称基于我在定义函数时指定的名称,而不是函数中使用的实际输入。一般来说,这是有道理的,但我想知道如何针对特定问题更改此行为
我想要的输出,给定输入 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 方面并没有我想象的那么好。
【问题讨论】: