2013-08-07 367 views
1

我目前正在多個命令行參數,比如我的[R腳本中:[R粘貼多個

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

,我想我的貼字符串中使用這些ARGS像下面。我的問題是,我只能弄清楚如何使用1個參數,而不是兩個(arg1,arg2)。而不是在我的where子句(即「(xxx)」中的columnname1)中顯示的「xxx」)如何使用「arg1」命令行參數代替「xxx」?我嘗試了很多不同的方式,出於某種原因我無法弄清楚。我應該連接兩個不同的字符串來完成這個還是有一個更簡單的方法?

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

感謝您的幫助!

回答

2

嘗試:

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

太棒了!這很好。我不敢相信這是多麼容易。謝謝! – slybitz

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) 
} 
+0

感謝您的建議。我想堅持上面提供的粘貼解決方案,但我將來會記住這一點。很有用! – slybitz