Использование sqldf с переменной r, содержащей в своем имени подчеркивание - PullRequest
0 голосов
/ 06 ноября 2018

Этот код

> A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
> color_num <- 2
> fn$sqldf("select * from A where col1 >= '$color_num'")

выдает ошибку

Ошибка в eval (parse (text = paste (..., sep = "")), env): object «цвет» не найден

Но если вместо переменной color_num дано имя без подчеркивания (скажем, colornum), то выполнение fn$sqldf("select * from A where col1 >= '$colornum'") даст ожидаемые результаты без ошибок.

Я полагаю, sqldf заменяет подчеркивания на точки за сценой, заставляя его рассматривать компонент, предшествующий подчеркиванию, как таблицу, а часть, следующую за именем столбца. Этот ответ (и комментарии) на вопрос об именах столбцов в sqldf указывает, что когда-то библиотека заменяла точки подчеркиванием, но больше не делает, но я не смог найти ничего о замене подчеркивания на точек.

Это проблема, поскольку соглашение об именах, которое я использую, интенсивно использует подчеркивания для имен переменных.

Есть ли способ получить имена переменных с подчеркиванием в них, работающих в sqldf запросах?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете использовать обратные метки:

fn$sqldf("select * from A where col1 >= `color_num`")
##   col1  col2
## 1    2  blue
## 2    3 green
0 голосов
/ 06 ноября 2018

Вы можете использовать paste0 вокруг вашего sql кода, так что r вычисляет color_num до 2, а затем вставляет его вместе в один оператор sql.

library(sqldf)
    A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
    color_num <- 2

    fn$sqldf(paste0("select * from A where col1 >=",color_num))

Если вы хотите использовать $var подход и у вас возникли проблемы с _, вот обходной путь, чтобы получить все переменные. вместо _ это, вероятно, неэффективно, но работает.

color_col <- "blue"
#get list of values with underscores and not your df
nms <- setdiff(ls(),c("A"))
#change name of list to have '.' instead of '_'
setNames(nms,gsub("_",".",nms))
#Assign values to names with '.'s
myvars <- lapply(setNames(nms,gsub("_",".",nms)), function(x){
  assign(gsub("_",".",x) , get(x))})
#bring them to global env
list2env(myvars,.GlobalEnv)

#run example query
fn$sqldf("select * from A where col1 >= '$color.num' and col2 = '$color.col' ")
...