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

时间:2016-08-12 04:25:56

标签: r

我想通过使用原始列相互减去来创建新列,我使用字符来表达新列的所有组合,然后我想使用dplyr::mutate来创建新列。 foo <- eval(parse(text = paste(new.feature,collapse = ",")))有问题,谢谢你的回答。

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)

当我使用paste(new.feature,collapse = ",")时,我会得到一个像这样的字符

paste(new.feature,collapse = ",")
  [1]&#34; Sepal.Length-Sepal.Width,Sepal.Length-Petal.Length,Sepal.Length-Petal.Width,Sepal.Length-Species,Sepal.Width-Petal.Length,Sepal.Width-Petal .WIDTH,Sepal.Width品种,Petal.Length-Petal.Width,Petal.Length品种,Petal.Width-物种&#34;

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

1 个答案:

答案 0 :(得分:1)

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

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)

请注意,现在sign.paste会返回语言表达式列表,而不是字符串。这基本上是您在评估字符串时设置的内容。然后我们确保使用mutate_这是mutate函数的标准评估版本。它允许我们将参数作为大列表而不是单独的参数传递。有关详细信息,请参阅vignette("nse")。 (我也仅限于数字列,以避免有关减去因子的警告)