R粘贴多个

时间:2013-08-07 15:24:48

标签: r command-line-arguments paste

我目前在R脚本中接受多个命令行参数,例如:

args<-commandArgs(TRUE)
arg1 <- as.numeric(args[1])
arg2 <- as.numeric(args[2])

我想在我的粘贴字符串中使用这些args,如下所示。我的问题是我只能弄清楚如何使用其中一个参数而不是两者(arg1,arg2)。而不是我在where子句中显示的“xxx”(即“(xxx)中的columnname1”)如何使用“arg1”命令行参数代替“xxx”?我尝试了许多不同的方法,由于某种原因,我无法弄明白。我应该连接两个不同的字符串来实现这一点,还是有更简单的方法?

SQL<-paste(
"SELECT 
 *
FROM
 table
WHERE
 columnname1 in (xxx)
 and
 columnname2 in ('",arg2,"')",sep = "")

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

尝试:

SQL<-paste(
"SELECT 
 *
FROM
 table
WHERE
 columnname1 in ('",arg1,"')
 and
 columnname2 in ('",arg2,"')",sep = "", collapse="")

答案 1 :(得分:1)

您还可以使用以下允许命名替换的辅助函数:

SQL<-strsubst(
  "SELECT * FROM table WHERE 
   columnname1 in ('$(arg1)') and 
   columnname2 in ('$(arg2)')", 
  list(arg1=arg1, arg2=arg2)
)

其中strsubst的定义如下:

strsubst <- function (template, map, verbose = getOption("verbose")) 
{
    pat <- "\\$\\([^\\)]+\\)"
    res <- template
    map <- unlist(map)
    m <- gregexpr(pat, template)
    idx <- which(sapply(m, function(x) x[[1]] != -1))
    for (i in idx) {
        line <- template[[i]]
        if (verbose) 
            cat("input: |", template[[i]], "|\n")
        starts <- m[[i]]
        ml <- attr(m[[i]], "match.length")
        sym <- substring(line, starts + 2, starts + ml - 2)
        if (verbose) 
            cat("sym: |", sym, "|\n")
        repl <- map[sym]
        idx1 <- is.na(repl)
        if (sum(idx1) > 0) {
            warning("Don't know how to replace '", paste(sym[idx1], 
                collapse = "', '"), "'.")
            repl[idx1] <- paste("$(", sym[idx1], ")", sep = "")
        }
        norepl <- substring(line, c(1, starts + ml), c(starts - 
            1, nchar(line)))
        res[[i]] <- paste(norepl, c(repl, ""), sep = "", collapse = "")
        if (verbose) 
            cat("output: |", res[[i]], "|\n")
    }
    return(res)
}