跨多行的字符串连续,没有换行符

时间:2012-11-14 18:02:45

标签: r newline word-wrap rodbc end-of-line

使用RODBC库将数据导入R.我有一个很长的查询,我想传递一个变量,就像this SO用户一样。

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

this question接受的解决方案建议简单地将文本拆分为块然后paste() - 这有效 - 但理想情况下我希望保持空白不变 - 使测试更容易/在粘贴到R之前验证查询在数据库中的行为。

在其他语言中,我很熟悉这里有一个简单的续行字符 - 事实上,接受答案中的几个comments正在寻找类似于python \的方法。

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

4 个答案:

答案 0 :(得分:18)

我不知道你是否会发现这有用或者没有,但我最终倾向于将我的SQL与我的R脚本分开。将查询保存在我的R脚本中,除了非常短的脚本之外,我发现很快就无法读取。

现在,我倾向于在自己单独的.sql文件中保留多行查询。然后我可以在漂亮的文本编辑器中保持它们的美观,格式化和可读性,并根据需要将它们读入R:

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

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

我用这种方式感到非常高兴,因为我发现使用非常长的paste语句和多行字符对象来混乱我的R脚本使得我的代码很难阅读。

答案 1 :(得分:13)

R strwrap将根据documentation销毁空格,包括换行符。

基本上,您可以通过最初让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)

答案 2 :(得分:8)

query <- gsub(pattern='\\s',replacement="",x=query)

答案 3 :(得分:0)

尝试使用sprintf获取变量替换,然后替换所有换行符和空格。

有关详细信息,请参阅my answer类似问题。