2010-08-27 26 views
7

Tôi đang xây dựng một gui cho phép tôi chọn một tập hợp con của một data.frame bằng cách nhấp vào các tên yếu tố khác nhau. Sau khi nhận được đầu vào của người dùng, làm thế nào để chuyển nó vào chức năng tập hợp con?làm cách nào để chuyển các tham số cho tập hợp con()?

ví dụ: Tôi có một khung dữ liệu df với các yếu tố MORNING và EVENING trong cột timeofday và RECEIVE và SEND trong cột optype. Từ GUI tôi biết rằng người dùng muốn một tập hợp con chỉ chứa NHẬN hoạt động, vì vậy tôi có chuỗi kí tự sau cũng như:

RequestedFactor1 mà bằng "optype"
RequestedRelationship1 bằng "=="
RequestedValue1 mà bằng " NHẬN ĐƯỢC "

Tôi có thể làm gì để các chuỗi đó chuyển chúng tới tập hợp con, để tôi nhận được kết quả tương tự như tôi đã gọi là tập hợp con (df, optype ==" RECEIVE ")?

TIA

Trả lời

4

Vì điều này bạn có thể sử dụng cấu trúc phân tích cú pháp, nhưng một lần nữa, tôi cảnh báo rằng đây thực sự là một việc khó khăn. Xin vui lòng đọc các tập tin trợ giúp về hai điều này rất cẩn thận. Vì vậy, trong trường hợp của bạn này trở thành:

subset(df,eval(parse(text=paste(RF1,RR1,RV1)))) 

Một ví dụ để minh họa cho một số bộ phận phức tạp:

> RF1 <- "optype" 

> RR1 <- "==" 

> RV1 <- "\"RECEIVE\"" 

> optype <- c("RECEIVE","Not") 

> ifelse(eval(parse(text=paste(RF1,RR1,RV1))),1,0) 
[1] 1 0 

Mind các thoát quote-dấu (\ ") này là cần thiết khi bạn muốn kiểm tra chống lại một. chuỗi, và không phải là đối tượng NHẬN Hoặc bạn có thể làm:.

> RF1 <- "optype" 

> RR1 <- "==" 

> RV1 <- "Text" 

> optype <- c("RECEIVE","Not") 

> Text <- "RECEIVE" 

> ifelse(eval(parse(text=paste(RF1,RR1,RV1))),1,0) 
[1] 1 0 
+0

Cảm ơn bạn! Nên nghĩ về nó. –

4

các toán tử so sánh trong R thực sự chức năng đặc biệt, vì vậy bạn có thể sử dụng do.call để chạy các chức năng, không cần eval và phân tích một nd những cơn đau đầu tiềm ẩn có thể đến từ đó. ví dụ:

rf1 <- 'Species' 
rr1 <- '==' 
rv1 <- 'setosa' 

subset(iris, do.call(rr1, list(get(rf1), rv1))) 

Bạn cần "nhận" biến để bạn có giá trị biến thay vì tên, phần còn lại có thể là chuỗi ký tự.

+5

Không thực sự cần phải sử dụng tập hợp con chút nào - 'iris [match.fun (rr1) (iris [[rf1]], rv1),]' – hadley

+1

'match.fun' sạch hơn nhiều so với câu trả lời được chấp nhận. – Vince

+0

Thx quý ông, tôi cũng học được. –

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