Ответ 1
query <- gsub(pattern='\\s',replacement="",x=query)
Я использую библиотеку RODBC для переноса данных в R. У меня есть длинный запрос, который я хочу передать переменной, подобно этому пользователю SO.
Проблема в том, что R интерпретирует пробелы/каретки в моем запросе как новую строку '\n'
.
Принятое решение для этого вопроса предлагает просто разбить текст на куски, а затем paste()
вместе - что работает, но в идеале я хотел бы сохранить пробел нетронутым - упрощает проверку/проверку поведения запроса в базе данных до вставки в R.
На других языках я знаком с простым символом продолжения строки - действительно, некоторые из комментариев в принятом ответе ищут подход, похожий на python \
.
Я нашел в стороне обходное решение, используя strwrap
в глубине списка дискуссий R, поэтому в интересах улучшения интернета я опубликую его здесь. Однако, если кто-то может указать направление на более элегантное/прямое решение, я с радостью приму ваш ответ.
query <- gsub(pattern='\\s',replacement="",x=query)
Я не знаю, найдете ли вы это полезное или нет, но в конечном итоге я склонен к тому, чтобы мой SQL был отделен от моих R-скриптов. Сохраняя запрос в моем R script, за исключением очень очень коротких, я считаю, что он не читается очень быстро.
В наши дни я стараюсь хранить запросы, которые являются более чем одной строкой в отдельном файле .sql. Затем я могу сохранить их красивыми, отформатированными и читаемыми в хорошем текстовом редакторе и прочитать их в R по мере необходимости через что-то вроде этого:
read_sql <- function(path){
stopifnot(file.exists(path))
sql <- readChar(path,nchar = file.info(path)$size)
sql
}
Для привязки параметров к запросам я просто сохраняю %s
, где параметр будет в файле .sql, а затем добавьте параметры в R с помощью sprintf
.
Мне было намного счастливее, так как я обнаружил, что загромождаю мои R-скрипты с действительно длинными операторами paste
и многострочными символьными объектами, из-за которых мой код действительно трудно читать.
R strwrap
уничтожит пробелы, включая символы новой строки, в документация.
По существу, вы можете получить желаемое поведение, сначала разрешив R ввести строки break/newline \n
s, а затем сразу же их отключить.
#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)
Попробуйте использовать sprintf для получения подстановки переменных, а затем замените все символы новой строки и пробелы.
Подробнее см. мой ответ.