R-在循环中使用粘贴功能导致我出现问题

时间:2017-06-23 16:27:27

标签: r

这很简单,但我想知道为什么以下不起作用。

作品

myvars=c("JourneyTravelTime","PaxType") 
formula=as.formula(paste("SumAmountBooked~",paste(myvars,collapse="+")))

输出(文字)

SumAmountBooked ~ JourneyTravelTime + PaxType

不起作用

i=1
formula=as.formula(paste("as.factor(Product",i,")",sep=""),paste(myvars,collapse="+"))

然后说没有找到对象Product1。我认为这是因为我将对象(i)与其他文本粘贴在一起寻找对象。有没有办法把它当作文本对待?我试过在不同的部分包装as.character,它没有帮助。

1 个答案:

答案 0 :(得分:2)

仔细检查您的代码将显示您实际上没有在不起作用的示例中将类似公式的字符串传递给as.formula。让我们一步一步地为您的代码添加一些结构。我们将每个参数放在一个函数中。

在第一个有效的示例中,您将字符串"SumAmountBooked~""JourneyTravelTime+PaxType"传递给paste。完整的字符串可以强制转换为有效的公式。

myvars = c("JourneyTravelTime", 
           "PaxType") 
# Notice that you have only ONE argument to `as.formula`

formula = 
  as.formula(
    paste("SumAmountBooked~",
          paste(myvars,
                collapse="+"))
  )

但是,在下一个示例中,您将两个字符串传递给as.formula。这导致R在环境as.factor(Product1)中查找对象"JourneyTravelTime+PaxType"。由于没有该名称的环境,对公式的强制失败。

i = 1
# Now you have TWO arguments to `as.formula`.  
# The second argument is the environment in which to find the first.
# You also have no '~'
formula=
  as.formula(
    paste("as.factor(Product",
          i,
          ")",
          sep=""),
    paste(myvars,
          collapse="+")
  )

获得所需结果的一种方法如下:

as.formula(
  paste0(
    paste0("as.factor(Product", 
           i, 
           ")"),
    " ~ ",
    paste(myvars, 
          collapse = "+")
  )
)

就个人而言,我倾向于使用sprintf来避免输入这么多paste命令。这可以帮助您将所需字符串的结构保持在一起,同时替换%s所在的部分。

as.formula(
  sprintf("as.factor(Product%s) ~ %s",
          i,
          paste0(myvars, collapse = "+"))
)