【问题标题】:Function argument as a part of the output name函数参数作为输出名称的一部分
【发布时间】:2012-04-20 10:49:26
【问题描述】:

也许是一个愚蠢的问题,但我在任何地方都找不到任何答案(我看过 :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 .....

任何建议将不胜感激:)

【问题讨论】:

  • 似乎是两个问题:要获得所有组合,您需要 expand.grid() (将导致缓慢的解决方案)或 outer() 如果您可以矢量化。然后另一点是关于构造名称:类似于 outer(x,y, function(foo,bar) paste("output",foo,bar, sep = "_")) 的东西,您可以将其分配给输出作为名称( df)
  • 我只对关于名称构造的部分感兴趣:)
  • 一个问题是 y=c(a,b,c) 会丢失名称。该函数将如何计算出 y 的哪些位是 a、b 和 c?您最好执行 foo=function(yvalues,...) 并从 ... 列表中获取其他变量。尽管我不确定您是否可以从...中获得名称而无需一些真正的技巧。您的问题还在于 'a' 不在功能环境中。我认为您可能在这里以完全错误的方式解决问题...
  • @Spacedman 我认为 Endre 应该将他的输入定义为 x=c('a','b','c') 。那么只需paste(x[i],'*2+',y[i],'^2',collapse='')就可以得到他想要的。
  • 我认为@Carl 解决方案结合assign 功能可以帮助您。

标签: r function arguments


【解决方案1】:

正如@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 2018-07-30
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多