2012-04-20 43 views
0

也许是一个愚蠢的问题,但我无法找到任何答案(我看过:P)。我试图创建一个带有两个参数的函数,它们是向量(例如,x = c(a,b,c)和y = c(50,75,100))。我将编写一个计算所有这些组合的函数,并将参数用作输出名称的一部分。例如。作为输出名称的一部分的函数参数

函数(X,Y)
DF $ output_a_50 = A * 2 + 50^2
DF $ output_a_75 = A * 2 + 75^2 .....

任何建议将是赞赏:)

+2

好像是两个问题:得到你需要或者expand.grid()(将导致一个缓慢的溶液)或外所有组合()如果你可以矢量化。然后另外一点是构造名称:类似outer(x,y,function(foo,bar)paste(“output”,foo,bar,sep =“_”)),您可以将其作为名称分配给输出df)< - xyz在返回之前 – mweylandt 2012-04-20 10:55:46

+0

我只对构建名称部分感兴趣:) – 2012-04-20 11:09:33

+0

一个问题是y = c(a,b,c)会丢失名称。函数如何计算y的哪些位是a,b和c?你可能会更好地做foo = function(yvalues,...)并从...列表中获取其他变量。虽然我不确定你可以从...中得到这些名字,没有一些真正的诡计。你的问题也是'a'不在功能环境中。我认为你可能在这里以完全错误的方式来解决问题...... – Spacedman 2012-04-20 11:17:53

回答

2

由于@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 
相关问题