我试图根据输入动态命名数据框的输出。
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有关,但在使用这些功能时,我的知识最多是模糊的。有人知道这可能吗?
感谢您的帮助!
答案 0 :(得分:1)
你title=..
声明在那里是almsot。
你要改为使用:
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(.)
。 paste
工作得很好。 答案 1 :(得分:0)
您正在寻找?deparse
和?substitute
等内容。
variableName <- function(x) {
return(deparse(substitute(x)))
}
variableName(title)
# [1] "title"
variableName(mpg)
# [1] "mpg"
答案 2 :(得分: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