1

我正在尝试根据输入动态命名数据框的输出。

get.max2 <- function(data = NULL, column)
{
  #require(qdap)
  col <- eval(substitute(column), data)
  max <- max(eval(substitute(column), data))
  name <- lookup(col, max, rownames(data))
  name <- name[!is.na(name)]
  #title <- do.call('paste', list(paste(match.call()[1])))
  df <- data.frame(name = name, title = max(col))
  print(df)
}

目前,输出如下所示:

get.max2(mtcars, mpg)

      name title
Volvo 142E  33.9

但是,我希望它看起来像这样:

get.max2(mtcars, mpg)

      name  mpg
Volvo 142E 33.9

我认为答案与 match.call/do.call 有关,但在使用这些函数时,我的知识充其量是模糊的。有谁知道这是否可能?

谢谢你的帮助!

4

3 回答 3

1

你的title=..声明几乎没有。

你想改用:

 title = paste(match.call()[-(1:2)], collapse=" ")   
 # the collapse argument is optional, it's not clear
 #    how you would like to handle multiple arguments

请注意与您所拥有的两个主要区别:

  1. 使用[-(1:2)]而不是[1]. 元素 frommatch.call()是您不想要的函数名称。或者,match.call()[3]如果您只需要第二个参数,您可以使用。
  2. 在这种情况下,不需要do.call(.). paste工作得很好。
于 2013-04-20T18:34:19.220 回答
0

感谢大家的帮助!我发现的另一个解决方法是在处理后重命名数据框。

get.max2 <- function(data = NULL, column)
{
  #require(qdap)
  #require(gdata)
  col <- eval(substitute(column), data)
  max <- max(eval(substitute(column), data))
  name <- lookup(col, max, rownames(data))
  name <- name[!is.na(name)]
  df <- data.frame(name = name, title = max(col))
  title2 <- do.call('paste', list(paste(match.call()[3])))
  df <- rename.vars(df, 'title', title2, info = F)
  return(df)
}

返回:

get.max2(mtcars, mpg)

      name  mpg
Volvo 142E 33.9
于 2013-04-20T18:42:36.097 回答
0

您正在寻找类似?deparseand的东西?substitute

variableName <- function(x) {
  return(deparse(substitute(x)))
}

variableName(title)
# [1] "title"

variableName(mpg)
# [1] "mpg"
于 2013-04-20T18:12:39.743 回答