【问题标题】:String continuation across multiple lines, no newline characters跨多行的字符串延续,没有换行符
【发布时间】:2012-11-03 06:53:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:
    query <- gsub(pattern='\\s',replacement="",x=query)
    

    【讨论】:

    • 这行得通。 \\s 到底是什么,有没有地方可以找到更多信息(我尝试了明显的 ?"\\s",但我怀疑帮助中没有提供正则表达式
    • @user5783745 manual page 提供更多信息。 \s 是 unix 风格的扩展正则表达式中的空白类。必须引用退格,因此 \\s.
    【解决方案2】:

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

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

    #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
    • 为什么不试试 gsub("\n", '', ...) ,正如 John Andrews 下面所建议的那样?为我工作。
    • @Audrey 这绝对更干净。将接受的答案更改为约翰的。谢谢!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      这样我更开心了,因为我发现用很长的 paste 语句和多行字符对象弄乱我的 R 脚本让我的代码很难阅读。

      【讨论】:

        猜你喜欢
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 2019-08-22
        相关资源
        最近更新 更多