1

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

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

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

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

谢谢你的帮助!

4

2 回答 2

2

尝试:

SQL<-paste(
"SELECT 
 *
FROM
 table
WHERE
 columnname1 in ('",arg1,"')
 and
 columnname2 in ('",arg2,"')",sep = "", collapse="")
于 2013-08-07T15:27:58.763 回答
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)
}
于 2013-08-07T15:35:55.317 回答