2015-03-18 17 views
7

Tôi đã tạo ra một hàm trong R dựa trên kind help của @Jim M.R: Sử dụng dplyr bên trong một hàm. ngoại lệ trong eval (expr, envir, enclos): Cột chưa biết

Khi tôi chạy chức năng tôi nhận được lỗi: Lỗi: Cột chưa biết 'rawdata' khi nhìn vào trình gỡ lỗi tôi nhận được thông báo: Rcpp :: ngoại lệ trong eval (expr, envir, enclos): unknown cột 'rawdata'

Tuy nhiên khi tôi nhìn vào cửa sổ môi trường tôi có thể xem 2 biến mà tôi đã chuyển đến hàm và chúng chứa thông tin rawdata với 7 yếu tố mức và refdata với 28 mức

function (refdata, rawdata) 
{ 
    wordlist <- expand.grid(rawdata = rawdata, refdata = refdata,  stringsAsFactors = FALSE) 
    wordlist %>% group_by(rawdata) %>% mutate(match_score =  jarowinkler(rawdata, refdata)) %>% 
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)]) 
} 

Trả lời

9

Đây là vấn đề với chức năng sử dụng NSE (đánh giá phi tiêu chuẩn). Các hàm sử dụng NSE rất hữu ích trong lập trình tương tác nhưng gây ra nhiều vấn đề trong phát triển tức là khi bạn cố gắng sử dụng các hàm bên trong các hàm khác. Do các biểu thức không được đánh giá trực tiếp, R không thể tìm thấy các đối tượng trong môi trường mà nó nhìn vào. Tôi có thể đề nghị bạn đọc here và tốt nhất là các vấn đề về phạm vi chương để biết thêm thông tin.

Trước hết, bạn cần biết rằng TẤT CẢ các chức năng chuẩn dplyr sử dụng NSE. Chúng ta hãy xem một ví dụ gần đúng cho vấn đề của bạn:

dữ liệu:

df <- data.frame(col1 = rep(c('a','b'), each=5), col2 = runif(10)) 


> df 
    col1  col2 
1  a 0.03366446 
2  a 0.46698763 
3  a 0.34114682 
4  a 0.92125387 
5  a 0.94511394 
6  b 0.67241460 
7  b 0.38168131 
8  b 0.91107090 
9  b 0.15342089 
10 b 0.60751868 

Hãy xem cách NSE sẽ làm cho vấn đề tình cảm đơn giản của chúng tôi:

Đầu tiên của tất cả các trường hợp tương tác đơn giản hoạt động:

df %>% group_by(col1) %>% summarise(count = n()) 

Source: local data frame [2 x 2] 

    col1 count 
1 a  5 
2 b  5 

Hãy xem điều gì xảy ra nếu tôi đặt nó vào một hàm:

lets_group <- function(column) { 
    df %>% group_by(column) %>% summarise(count = n()) 
} 

>lets_group(col1) 
Error: index out of bounds 

Không phải lỗi giống như lỗi của bạn mà do NSE gây ra. Chính xác cùng một dòng mã hoạt động bên ngoài hàm.

May mắn thay, có một giải pháp cho vấn đề của bạn và đó là đánh giá tiêu chuẩn. Hadley cũng đã tạo ra các phiên bản của tất cả các hàm trong dplyr sử dụng đánh giá tiêu chuẩn. Chúng chỉ là các hàm bình thường cộng với dấu gạch dưới _ ở cuối.

Bây giờ nhìn vào cách này sẽ làm việc:

#notice the formula operator (~) at the function at summarise_ 
lets_group2 <- function(column) { 
    df %>% group_by_(column) %>% summarise_(count = ~n()) 
} 

Điều này mang lại kết quả sau đây:

#also notice the quotes around col1 
> lets_group2('col1') 
Source: local data frame [2 x 2] 

    col1 count 
1 a  5 
2 b  5 

tôi không thể kiểm tra vấn đề của bạn nhưng sử dụng SE thay vì NSE sẽ cung cấp cho bạn kết quả mong muốn . Để biết thêm thông tin, bạn cũng có thể đọc here

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