13

我正在使用 RODBC 库将数据带入 R。我有一个很长的查询,我想将一个变量传递给,就像这个SO 用户一样。

问题是 R 将我的查询中的空格/回车解释为换行符'\n'

这个问题的公认解决方案建议简单地将文本分成块然后paste()一起 - 这有效,但理想情况下我希望保持空白完整 - 使得在数据库中测试/验证查询的行为变得更加容易在粘贴到 R 之前。

在我熟悉的其他语言中,有一个简单的续行字符 - 事实上,关于已接受答案的一些评论正在寻找类似于 python 的\.

strwrap我在 R 讨论列表的深处找到了一个解决方法,所以为了让互联网变得更好,我会在这里发布。但是,如果有人可以指出更优雅/直接的解决方案的方向,我会很乐意接受您的回答。

4

4 回答 4

18

我不知道您是否会发现这有帮助,但我最终倾向于将我的 SQL 与我的 R 脚本分开。将查询保留在我的 R 脚本中,除了非常短的查询,我发现很快就会变得不可读。

这些天来,我倾向于将超过一行的查询保存在自己单独的 .sql 文件中。然后我可以在一个漂亮的文本编辑器中保持它们的格式和可读性,并根据需要通过以下方式将它们读入 R:

read_sql <- function(path){
    stopifnot(file.exists(path))
    sql <- readChar(path,nchar = file.info(path)$size)
    sql
}

为了将参数绑定到查询中,我只需%s在 .sql 文件中保留参数的位置,然后使用 .sql 在 R 中添加参数sprintf

I've been much happier this way, as I was finding that cluttering up my R scripts with really long paste statements and multi-line character objects was making my code really hard to read.

于 2012-11-14T18:15:14.793 回答
13

根据文档, Rstrwrap将破坏空格,包括换行符。

本质上,您可以通过最初让 R 引入换行符/换行符\n,然后立即将它们剥离来获得所需的行为。

#make query using PASTE
query_1 <- paste("SELECT map.ps_studentid 
      ,students.first_name || ' ' || students.last_name AS full_name
      ,map.testritscore
      ,map.termname
      ,map.measurementscale
FROM map$comprehensive_with_growth map
JOIN students 
  ON map.ps_studentid = students.id
WHERE map.termname = '",map_term,"'", sep='')

#remove newline characters introduced above.  
#width is an arbitrary big number-
#it just needs to be longer than your string.
query_1 <- strwrap(query_1, width=10000, simplify=TRUE)

#execute the query 
map_njask <- sqlQuery(XE, query_1)
于 2012-11-14T18:02:44.823 回答
11
query <- gsub(pattern='\\s',replacement="",x=query)
于 2014-03-21T15:28:43.773 回答
0

Try using sprintf to get variable substitution, and then replacing all newlines and whitespace.

See my answer to a similar question for details.

于 2013-03-28T15:29:35.777 回答