跨多行的字符串连续性,无换行符

15

我正在使用RODBC库将数据导入R。我有一个很长的查询语句,想要传递一个变量,就像这个 Stack Overflow用户所述。

问题在于,R会将查询语句中的空格/换行符解释为换行符'\n'

针对这个问题的解决方案建议简单地将文本分成多个部分,然后使用paste()连接起来 - 这有效,但是理想情况下,我希望保持空格不变 - 这样可以更轻松地在粘贴到R之前测试/验证查询在数据库中的行为。

在我熟悉的其他语言中,都有一个简单的行连续字符 - 实际上,答案中的一些评论都在寻找类似于Python的\方法。

我在R讨论列表的深处找到了一个使用strwrap的解决方法,为了让互联网变得更好,我将在这里发布它。但是,如果有人能够指引我向更优雅/直观的解决方案,我将非常乐意接受你的答案。

4个回答

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 脚本会让我的代码变得很难读。


13

R的strwrap函数会破坏空格,包括换行符,参考文档

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

不错,谢谢!不过应该将 strwrap 的输出重新赋值给上面的 query_1 - Leo
3
为什么不试试John Andrews在下面建议的gsub("\n", '', ...)呢? 这对我很有效。 - Audrey
1
@Audrey,这绝对更简洁。我将采纳John的答案。谢谢! - Andrew

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

这个有效。\\s 是什么,是否有可以查找更多信息的地方?(我尝试了显而易见的 ?"\\s",但我怀疑正则表达式不在帮助文档中提供。) - stevec
1
@user5783745,手册页面提供了更多信息。\s是Unix风格扩展正则表达式中的空白字符类。退格必须加引号,因此为\\s - C8H10N4O2

0

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

有关详细信息,请参见我的答案类似问题的解答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接