R 根据输入动态更改列名

R 根据输入动态更改列名,r,function,dataframe,do.call,qdap,R,Function,Dataframe,Do.call,Qdap,我试图根据输入动态命名数据帧的输出 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)]

我试图根据输入动态命名数据帧的输出

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
get.max2(mtcars, mpg)

      name  mpg
Volvo 142E 33.9
我认为答案与match.call/do.call有关,但在使用这些函数时,我的知识充其量是模糊的。有人知道这是否可能吗


谢谢你的帮助

您正在寻找类似
?deparse
?substitute
的内容

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

variableName(title)
# [1] "title"

variableName(mpg)
# [1] "mpg"

variableName您正在寻找类似
?deparse
?substitute
的内容

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

variableName(title)
# [1] "title"

variableName(mpg)
# [1] "mpg"

variableName您的
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:2)]
    而不是
    [1]
    match.call()
    中的元素是您不想要的函数名。或者,如果只需要第二个参数,可以使用
    match.call()[3]
  • 在这种情况下,不需要
    do.call(.)
    <代码>粘贴
  • 工作正常
    你的
    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:2)]
    而不是
    [1]
    match.call()
    中的元素是您不想要的函数名。或者,如果只需要第二个参数,可以使用
    match.call()[3]
  • 在这种情况下,不需要
    do.call(.)
    <代码>粘贴
  • 工作正常
    谢谢大家的帮助!我发现的另一个解决方法是在处理后重命名数据帧

    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 <- 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)
    }