提问者:小点点

关于在R中使用字符串作为函数参数


我想通过使用原始列彼此相减来创建新列,我想使用字符来表示所有新列的组合,然后我想使用dplyr::mutate来创建新列。foo中有错误

col.names <- names(iris)
sign.paste <- function(x){paste(x,collapse = "-")}
new.feature <- apply(combn(col.names,2),2,sign.paste)
paste(new.feature,collapse = ",")
foo <- eval(parse(text = paste(new.feature,collapse = ",")))
dplyr::mutate(iris,foo)

当我使用粘贴(new.feature,collapse=“,”)时,我会得到如下字符

paste(new.feature,collapse = ",")

最后,我想使用mutate创建新的列,但是失败了...


共1个答案

匿名用户

你不能只是混合和匹配字符串和适当的语言表达式。如果可能的话,最好避免ava()。这里有一种方法可以构建一个表达式来定义所有的减法,然后执行它。

col.names <- names(iris)[sapply(iris, is.numeric)]
sign.paste <- function(x){substitute(x-y, list(x=as.name(x[1]), y=as.name(x[2])))}
new.feature <- apply(combn(col.names,2),2,sign.paste)

dplyr::mutate_(iris,.dots=new.feature)

请注意,现在签名。粘贴返回语言表达式列表,而不是字符串。这基本上是你在评估字符串时设置的。然后我们确保使用mutate\uuu,这是mutate函数的标准评估版本。它允许我们将参数作为一个大列表传递,而不是单独的参数。有关更多信息,请参见vignette(“nse”)。(我还仅限于数字列,以避免有关因子减法的警告)