Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr过滤SQLite数据库时,是否应避免使用`| `?_R_Sqlite_Filter_Dplyr - Fatal编程技术网

使用dplyr过滤SQLite数据库时,是否应避免使用`| `?

使用dplyr过滤SQLite数据库时,是否应避免使用`| `?,r,sqlite,filter,dplyr,R,Sqlite,Filter,Dplyr,在R中使用dplyr筛选SQLite数据库时,我遇到了一些意外行为。下面是我看到的示例: library(dplyr) # Some test data df <- tbl_df(data.frame( v1 = c('a', 'b', 'a', 'b'), v2 = c('b', 'a', 'a', 'b'), v3 = month.abb[1:4])) db <- copy_to(src_sqlite('example.sqlite', create = TRUE

在R中使用dplyr筛选SQLite数据库时,我遇到了一些意外行为。下面是我看到的示例:

library(dplyr)

# Some test data
df <- tbl_df(data.frame(
  v1 = c('a', 'b', 'a', 'b'),
  v2 = c('b', 'a', 'a', 'b'),
  v3 = month.abb[1:4]))

db <- copy_to(src_sqlite('example.sqlite', create = TRUE), df)

filter(df, v1 == 'a' | v2 == 'a', v3 == 'Jan') 
# Source: local data frame [1 x 3]
#
#   v1 v2  v3
# 1  a  b Jan

filter(db, v1 == 'a' | v2 == 'a', v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [2 x 3]
# Filter: v1 == "a" | v2 == "a", v3 == "Jan" 
#
#  v1 v2  v3
# 1  a  b Jan
# 2  a  a Mar
使用dplyr在数据库中工作时应避免使用|

更新: 如果你这样做

filter(db, v1 == 'a' | v2 == 'a', v3 == 'Jan') %>% show_query()
你会看到它变成了

<SQL>
SELECT "v1", "v2", "v3"
FROM "df"
WHERE "v1" = 'a' OR "v2" = 'a' AND "v3" = 'Jan'
您可以添加自己的括号以避免问题

filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan') %>% show_query()
# <SQL>
# SELECT "v1", "v2", "v3"
# FROM "df"
# WHERE ("v1" = 'a' OR "v2" = 'a') AND "v3" = 'Jan'

filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [1 x 3]
# Filter: (v1 == "a" | v2 == "a"), v3 == "Jan" 
# 
#   v1 v2  v3
# 1  a  b Jan

如果在SQL中有多个条件,我不确定dplyr为什么不隐式地为您添加括号,因为它似乎确实为data.frame正确地计算了这些条件。你可以考虑看看官方的立场是什么,因为对我来说,它看起来像个虫子。< / P>这绝对是个bug。
WHERE "v1" = 'a' OR ("v2" = 'a' AND "v3" = 'Jan')
filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan') %>% show_query()
# <SQL>
# SELECT "v1", "v2", "v3"
# FROM "df"
# WHERE ("v1" = 'a' OR "v2" = 'a') AND "v3" = 'Jan'

filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [1 x 3]
# Filter: (v1 == "a" | v2 == "a"), v3 == "Jan" 
# 
#   v1 v2  v3
# 1  a  b Jan