Đâ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