由于@Spacedman和其他人讨论,你的问题是,如果你通过c(a, b, c)
到你的函数,名称将会丢失。在我看来,最好的选择是通过一个列表:
foo <- function(x, y) {
df <- list()
for (xx in names(x)) {
for (yy in y) {
varname <- paste("output", xx, yy, sep = "_")
df[[varname]] <- x[[xx]]*2 + yy^2
}
}
df
}
foo(x = list(a = NA, b = 1, c = 2:3),
y = c(50, 75, 100))
# $output_a_50
# [1] NA
#
# $output_a_75
# [1] NA
#
# $output_a_100
# [1] NA
#
# $output_b_50
# [1] 2502
#
# $output_b_75
# [1] 5627
#
# $output_b_100
# [1] 10002
#
# $output_c_50
# [1] 2504 2506
#
# $output_c_75
# [1] 5629 5631
#
# $output_c_100
# [1] 10004 10006
好像是两个问题:得到你需要或者expand.grid()(将导致一个缓慢的溶液)或外所有组合()如果你可以矢量化。然后另外一点是构造名称:类似outer(x,y,function(foo,bar)paste(“output”,foo,bar,sep =“_”)),您可以将其作为名称分配给输出df)< - xyz在返回之前 – mweylandt 2012-04-20 10:55:46
我只对构建名称部分感兴趣:) – 2012-04-20 11:09:33
一个问题是y = c(a,b,c)会丢失名称。函数如何计算y的哪些位是a,b和c?你可能会更好地做foo = function(yvalues,...)并从...列表中获取其他变量。虽然我不确定你可以从...中得到这些名字,没有一些真正的诡计。你的问题也是'a'不在功能环境中。我认为你可能在这里以完全错误的方式来解决问题...... – Spacedman 2012-04-20 11:17:53