2017-06-19 16 views
7
Error: Cannot pass NA to dbQuoteIdentifier() 

Ngoài: Thông điệp cảnh báo:Lỗi: Không thể vượt qua NA để dbQuoteIdentifier() trong gói sqldf trong R

In field_types[] <- field_types[names(data)] : 
    number of items to replace is not a multiple of replacement length 

Đây là thông báo lỗi tôi nhận được khi cố gắng chạy bất cứ điều gì với gói sqldf ngày nay các truy vấn tương tự chạy hôm qua không chạy ngày hôm nay, tôi đang làm gì sai?

+2

Vui lòng xem lại [ask] và [mcve]. –

Trả lời

1

Tôi đã gặp vấn đề tương tự ngày hôm qua khi đột nhiên tôi không thể tải bảng từ R lên db SQLite trên máy tính từ xa của tôi.

lghdb <- dbConnect(SQLite(), 'lgh.db' 
dbWriteTable(lghdb, 'SrtrRisks', SrtrRisks) 
Error: Cannot pass NA to dbQuoteIdentifier()... 

Sau muddling khoảng một thời gian, tôi nhận ra rằng lỗi này là do cơ sở dữ liệu SQLite giải quyết được "khóa" do một chưa hoàn thành (không cam kết) giao dịch, liên quan đến công việc đồng thời của tôi bằng cách sử dụng SQLite Browser. Sự cố đã biến mất sau khi tôi đã cam kết giao dịch đang chờ xử lý.

Tôi đoán bạn cũng phải tìm ra điều này vì bạn không theo dõi bài đăng của mình. Nó có thể là tốt đẹp cho những người RSQLite để xem liệu họ có thể trả lại một thông báo lỗi hữu ích hơn trong những trường hợp này.

Larry Hunsicker

5

tôi đã cùng một vấn đề:

Error: Cannot pass NA to dbQuoteIdentifier() 
In addition: Warning message: 
In field_types[] <- field_types[names(data)] : 
number of items to replace is not a multiple of replacement length 

sau khi một số nghiên cứu, tôi nhận thấy tôi đã chọn cùng một cột hai lần trong một bảng:

table1<- sqldf("select columnA, 
         columnA, 
         keyA 
       from tableA") 
table2<- sqldf("select columnB, 
         keyB 
       from tableB") 

problematicMerge<- sqldf("select a.*, 
           b.* 
          from tableA a join 
           tableB 
          on a.keyA = b.keyB") 

này đã được giải quyết bằng cách thay đổi table1 để loại bỏ các cột trùng lặp (xem bên dưới: - Tôi nghi ngờ răng cưa một trong các cột để có một tên khác nhau cũng sẽ làm các trick):

table1<-sqldf("select columnA, 
         keyA 
       from tableA") 

Hope this helps

+0

Tôi đã thêm vấn đề # 230 vào danh sách vấn đề gói RSQLite. https://github.com/rstats-db/RSQLite/issues/230 –

0

tôi cũng gặp phải lỗi tương tự:

## step1: encountered the error as below while joining two tables 
    screens_temp_2 = sqldf("SELECT a.* , b.ue as 'sp_used_ue' , b.te as 
    'sp_used_te' from screens_temp a left outer join sp_temp b on 
    a.screen_name = b.screen_name ") 
    Error: Cannot pass NA to dbQuoteIdentifier() 
    In addition: Warning message: 
    In field_types[] <- field_types[names(data)] : 
    number of items to replace is not a multiple of replacement length 
    ## step2: while checking the column names , this is what i found 
    colnames(screens_temp) 
    [1] "screen_name" "usv"   "tsv"   "20_ue"  "20_te"  
    [6] "40_ue"  "40_te"  "60_ue"  "60_te"  "80_ue"  
    [11] "80_te"  "100_ue"  "100_te"  "sp_load_ue" "sp_load_te" 
    [16] "sp_load_ue" "sp_load_te" 

Kết quả trên cho thấy sp_load_ue và sp_load_te được lặp đi lặp lại.

## below i corrected the column names: 
    colnames(screens_temp) <- c("screen_name", "usv", "tsv", "20_ue", "20_te", "40_ue" , "40_te" , "60_ue" , "60_te" , "80_ue" , "80_te"  ,"100_ue" , "100_te" , "sp_load_ue" , "sp_load_te" , "sp_used_ue" , "sp_used_te") 
    write.table(screens_temp, "screens_temp_corrected.csv", row.names = FALSE ,col.names = TRUE, sep = ",") 

    ## again i ran step 1, it worked fine. 

Lưu ý: Tôi nghĩ rằng có lỗi trong sqldf do nó cho phép tên cột được lặp lại trong khi gán đầu ra cho một khung dữ liệu. Nó sẽ ném một lỗi/cảnh báo trong khi gán đầu ra cho một khung dữ liệu để người dùng có thể đổi tên các cột một cách thích hợp.

+0

Điều này xảy ra khi khung dữ liệu được ghi vào cơ sở dữ liệu trong cuộc gọi 'dbWriteTable', không phải khi nó được đọc lại. Điều này xảy ra ngay cả khi không có sqldf. Ví dụ, nếu 'thư viện (RSQLite); đ <- data.frame (1,2); tên (đ) <- c ("a", "a"); con <- dbConnect (SQLite()); dbWriteTable (con, "dd", dd) 'cho rằng lỗi trong khi' sqldf ("chọn nhu cầu, nhu cầu từ BOD") 'không. Nếu bạn sử dụng chương trình phụ trợ RH2, nó sẽ báo cáo cột Trùng lặp là lỗi và sẽ xác định tên cột trùng lặp. –

1

Đã xảy ra sự cố tương tự với sqldf bên trong vòng lặp. Giải quyết nó bằng cách đặt nó bên trong data.frame gọi: data.frame (sqldf (..)).

Các vấn đề liên quan