Опасайтесь "предполагать, что умножение обычно лучше, таким образом, я пытаюсь придерживаться этого, когда я кодирую",
В контексте этого конкретного вопроса, лучше здесь означает "быстрее". Который не очень полезен.
Взгляды о скорости могут быть серьезной ошибкой. Существуют глубокие ошибочные последствия в определенной алгебраической форме вычисления.
См. арифметика С плавающей точкой с анализом ошибок . См. Важные вопросы в Арифметике С плавающей точкой и Анализе ошибок .
, В то время как некоторые значения с плавающей точкой точны, большинство значений с плавающей точкой является приближением; они - некоторое идеальное значение плюс некоторая ошибка. Каждая операция относится к идеальному значению и ошибочному значению.
самые большие проблемы возникают из попытки управлять двумя почти-равными-количествами. Самые правые биты (биты ошибки) прибывают для доминирования над результатами.
>>> for i in range(7):
... a=1/(10.0**i)
... b=(1/10.0)**i
... print i, a, b, a-b
...
0 1.0 1.0 0.0
1 0.1 0.1 0.0
2 0.01 0.01 -1.73472347598e-18
3 0.001 0.001 -2.16840434497e-19
4 0.0001 0.0001 -1.35525271561e-20
5 1e-05 1e-05 -1.69406589451e-21
6 1e-06 1e-06 -4.23516473627e-22
В этом примере, Вы видите, что, поскольку значения становятся меньшими, различие почти между равными количествами создают ненулевые результаты, где корректный ответ является нулем.
вы можете переопределить оператор% +%, чтобы улучшить синтаксис конкатенации строк:
'%+%' <- function(x,y) paste(x,y,sep="")
y<-"y1"
x<-"somethingorother"
query<-
'SELECT DISTINCT x AS ' %+% x %+%',\n' %+%
' y AS ' %+% y %+% '\n' %+%
' FROM tbl
WHERE id=%s
AND num=%d'
cat(query,"\n")
дает:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1
FROM tbl
WHERE id=%s
AND num=%d
Если вы старый программист на C, как и я, вам может понравиться просто использовать sprintf ().
Заимствуя пример Яна:
y<-"y1"
x<-"somethingorother"
query <- sprintf(
'SELECT DISTINCT x AS %s,
y AS %s,
FROM tbl
WHERE id=%%s
AND num=%%d', x, y)
дает:
> cat(query,"\n")
SELECT DISTINCT x AS somethingorother,
y AS y1,
FROM tbl
WHERE id=%s
AND num=%d
I ' d рекомендует просто использовать простую строку, а не встраивать в нее значения переменных. Вместо этого используйте заполнители.
sql <- "SELECT foo FROM bar
WHERE col1 = ?
AND col2 = ?
ORDER BY yomama"
Я не уверен, что двойные кавычки - лучший способ встраивать многострочные строки в код R (есть ли что-то вроде here-docs?), Но это работает, в отличие от Java.
По какой-то причине вы не хотите отправлять "\ n"
или "\ t"
в свою базу данных? Они должны быть в порядке в SQL.
Я просто попал в строку sql с помощью sql <- gsub ("\ n", "", sql)
и sql <- gsub ("\ t", "", sql)
перед его запуском. Сама строка может быть любой длины, но не содержит разметки конкатенации.