R 스크립트에 형식화 된 SQL 문자열을 우아하게 포함시킬 수 있습니까?
문제
긴 SQL 문자열을 사용하는 R 스크립트에서 작업하고 있으며 편집자와 응용 프로그램 간의 복사 및 붙여 넣기를 위해 쿼리에 다른 마크 업이 비교적 자유롭게 유지하고 싶습니다. 또한 더 나은 가독성을 위해 쿼리를 라인에 분할 할 수있는 기능을 원합니다.
RODBC 문서에서 paste
함수는 별도의 청크로 쿼리를 빌드하는 데 사용되지만 덜 Kludgy와 더 적은 인용문과 쉼표를 선호합니다. 당신의 도움을 주셔서 감사합니다.
해결책
%+ % 연산자를 재정의하여 더 나은 문자열 컨덕턴스 구문을 가질 수 있습니다.
'%+%' <- function(x,y) paste(x,y,sep="")
y<-"y1"
x<-"somethingorother"
query<-
'SELECT DISTINCT x AS ' %+% x %+%',\n' %+%
' y AS ' %+% y %+% '\n' %+%
' FROM tbl
WHERE id=%s
AND num=%d'
cat(query,"\n")
수확량 :
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1
FROM tbl
WHERE id=%s
AND num=%d
다른 팁
당신이 나와 같이 오래된 C 프로그래머라면, 당신은 sprintf ()를 사용하는 것을 즐길 수 있습니다.
Ian의 예를 빌린다 :
y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
y AS %s,
FROM tbl
WHERE id=%%s
AND num=%%d', x, y)
수확량 :
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1,
FROM tbl
WHERE id=%s
AND num=%d
우아한 방법 "포함" 긴 SQL 쿼리는 별도의 .sql
파일. 바람직하게는 어딘가에 구문을 강조 할 수있는 곳에서 Rstudio의 텍스트 파일이 작업을 수행합니다. 그런 다음 메인 R 스크립트에서 파일을 문자열로 읽고 많은 "명명 된"중 하나를 사용하여 변수로 채울 수 있습니다. sprintf
-유형의 솔루션 Infuser.
.SQL
select *
from mytable
where id = {{a}}
and somevar = {{b}}
.아르 자형
library(readr)
library(infuser)
query <- read_file("query.sql") %>%
infuse(a = 1, b = 2)
평범한 문자열을 사용하는 것이고 변수 값을 포함하지 않는 것이 좋습니다. 대신 자리 소유자를 사용하십시오.
sql <- "SELECT foo FROM bar
WHERE col1 = ?
AND col2 = ?
ORDER BY yomama"
Double-Quote가 R 코드에 멀티 라인 문자열을 포함시키는 가장 좋은 방법인지 확실하지 않지만 (Here-Docs와 같은 것이 있습니까?) Java와 달리 작동합니다.
보내고 싶지 않은 이유가 있습니까? "\n"
또는 "\t"
데이터베이스에? SQL에서는 괜찮아 야합니다.
나는 단순히 SQL 문자열을 쳤다 sql <- gsub("\n","",sql)
그리고 sql <- gsub("\t","",sql)
실행하기 전에. 문자열 자체는 필요한만큼 길지만 연결 마크 업이 없어집니다.