2015-12-02 15 views
12

Tôi nhận được kết quả buồn cười bằng cách sử dụng mutate với khai thác $ khi có biến trong môi trường toàn cục có cùng tên là phần tử được trích xuất. (Tôi đang chạy R 3.1.3 và dplyr 0.4.3.9.) Này hoạt động tốt:biến thể() đang cố gắng trích xuất bằng cách sử dụng giá trị của biến toàn cục khi sử dụng toán tử ký hiệu đô la

library(dplyr) 

df <- data.frame(time = 1:5, val = c(2.3, 3.9, NA, 8.1, 9.6)) 

mutate(df, val = approx(time, val, time)$y) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

Nhưng nếu tôi định nghĩa một biến toàn cầu y, điều buồn cười xảy ra:

y <- 1L 
mutate(df, val = approx(time, val, time)$y) 
# Error: invalid subscript type 'integer' 

Lưu ý rằng việc sử dụng dấu ngoặc kép với một đối số chuỗi vẫn hoạt động như mong đợi:

mutate(df, val = approx(time, val, time)[['y']]) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

Điều thú vị là, chúng ta có được một loại khác nhau của lỗi nếu y là một nhân vật:

012.
y <- 'a' 
mutate(df, val = approx(time, val, time)$y) 
# Error: unsupported type for column 'val' (NILSXP, classes = NULL) 

Cuối cùng, cho đầy đủ, đây là một ví dụ chứng minh rằng điều này chắc chắn không là hành vi thông thường cho khai thác danh sách:

l <- list(y = 1:4) 
y <- 'a' 
l$y 
# [1] 1 2 3 4 

Có ai biết lý do tại sao chúng tôi nhận hành vi kỳ lạ này bên mutate? Và có cách nào dễ dàng để khắc phục sự cố này, ngoài việc sử dụng dấu ngoặc kép để trích xuất hoặc đảm bảo rằng không có biến xung đột trên đường dẫn tìm kiếm?

Bằng cách này, nó trông giống như OP trong bài sau đây có thể có cùng một vấn đề nhưng không khá nhận ra nó: dplyr mutate fails with named vector?

+2

Có vẻ như một lỗi. Bạn có thể sử dụng '$ 'y'', nhưng đó chỉ là một hack. – Frank

+1

Tôi muốn gửi [báo cáo lỗi] (https://github.com/hadley/dplyr/issues). Việc khai thác khung đôi có vẻ như một cách giải quyết rất hợp lý. Bạn cũng có thể làm điều thú vị này: 'mutate (df, val = \' $ \ '(khoảng (thời gian, val, thời gian)," y "))' – MrFlick

+0

Thực ra, có vẻ như ai đó đã gửi lỗi này dưới dạng lỗi sáu ngày trước: https://github.com/hadley/dplyr/issues/1554 – clbieganek

Trả lời

2

Như @clbieganek chỉ ra, đây là một lỗi. Đó là chưa cố định (tính dplyr phiên bản 4.3)

có thể sửa chữa như đề xuất trong ý kiến:

$'y'

Đây là vấn đề mà theo dõi vấn đề chung này: https://github.com/hadley/dplyr/issues/1400

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