使用RODBC库将数据导入R.我有一个很长的查询,我想传递一个变量,就像this SO用户一样。
问题是R将我的查询中的空格/回车符解释为换行符'\n'
。
this question接受的解决方案建议简单地将文本拆分为块然后paste()
- 这有效 - 但理想情况下我希望保持空白不变 - 使测试更容易/在粘贴到R之前验证查询在数据库中的行为。
在其他语言中,我很熟悉这里有一个简单的续行字符 - 事实上,接受答案中的几个comments正在寻找类似于python \
的方法。
我在R讨论列表的内容中使用strwrap
找到了一个解决方法,所以为了使互联网更好,我会在这里发布。但是,如果有人可以指出更优雅/直接的解决方案,我很乐意接受你的回答。
答案 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类似问题。