2010-08-27 11 views
7

Buduję gui, które pozwala mi wybrać podzbiór danych.frame, klikając na różne nazwy czynników. Po otrzymaniu danych wprowadzonych przez użytkownika, w jaki sposób przekazać go do funkcji podzestawu?Jak przekazać parametry do podzbioru()?

np .: Mam ramkę danych z współczynnikami RORNING i EVENING w kolumnie timeofday oraz RECEIVE i SEND w kolumnie optype. Z GUI wiem, że użytkownik chce podzbioru zawierającego otrzymać tylko operacje, więc mam następujące ciągi także:

RequestedFactor1 który równa się „optype”
RequestedRelationship1 równa się „==”
RequestedValue1 który równa się " Odbierz”

Co mogę zrobić, aby tych ciągów przekazać je do podzbioru, tak że będę otrzymywać taką samą moc, jak gdybym nazwał podzbiór (df, optype ==«odbiór»)?

TIA

Odpowiedz

4

W tym celu można użyć konstruktu eval-składniowy, ale znowu ja ostrzegam, że to jest rzeczywiście prosta sprawa. Przeczytaj uważnie pliki pomocy dotyczące tych dwóch elementów. Więc w twoim przypadku to będzie:

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

przykład do zilustrowania niektórych skomplikowanych części:

> RF1 <- "optype" 

> RR1 <- "==" 

> RV1 <- "\"RECEIVE\"" 

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

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

uwadze uciekły cytat-znaków (\ ") Jest to konieczne, ponieważ chcesz przetestować przed a. ciąg, a nie odbioru przedmiotu Alternatywnie można zrobić.

> 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

Dziękujemy! Powinienem o tym pomyśleć. –

4

operatorzy porównania w R są rzeczywiście funkcje specjalne, dzięki czemu można używać do.call uruchomić funkcje, nie ma potrzeby eval i analizowania i potencjalne bóle głowy, które mogą z tego wyniknąć. np .:

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

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

Musisz "dostać" zmienną, abyś miał wartość zmiennej zamiast nazwy, reszta może być ciągami znaków.

+5

Nie ma potrzeby używania w ogóle podzbioru - 'iris [match.fun (rr1) (iris [[rf1]], rv1),]' – hadley

+1

'match.fun' jest znacznie czystszy niż zaakceptowana odpowiedź. – Vince

+0

thx panowie, ja też się uczę. –

Powiązane problemy