2012-09-07 25 views
3

我建立一個自定義的GUI中的R爲工作,我需要有能夠選擇基於可變值的數據幀的子集的一部分(即,選擇高於50所有女性等等。)。我建立與gwidgets的GUI,但我堅持關於這個過濾器是如何實現的。具體如何創建一個小部件,允許用戶選擇一個或多個過濾器,然後返回過濾的數據幀。GUI到子集的數據幀中的R

下面是從數據的小樣本我一起工作:

structure(list(kunde = c(3, 3, 3, 3, 3, 3, 3, 1, 3, 3), 
       bank = c(7,98, 3, 3, 98, 2, 2, 1, 7, 2)), 
      .Names = c("kunde", "bank"), row.names = c(NA, 10L), class = "data.frame") 

任何幫助是極大的讚賞!

+0

???當你的數據對象沒有這樣的價值時,你如何計劃在「女性」上進行子集劃分? –

+0

性別變量是在數據中,但我只是用它作爲這個問題的例子。我想象任何示例都可以很容易地通過過濾給定的性別變量; –

+0

您可能希望考慮將GUI嵌入到更大的框架(如Deducer或R Commander)中。您將免費獲得一些這些數據處理任務。 (例如http://www.deducer.org/pmwiki/pmwiki.php?n=Main.Subset) –

回答

2

裏有ProgGUIinR包類似的事情的一些例子。這裏是其中的一個:

library(gWidgets) 
options(guiToolkit="RGtk2") 
options(repos="http://streaming.stat.iastate.edu/CRAN") 
d <- available.packages()  # pick a cran site 

w <- gwindow("test of filter") 
g <- ggroup(cont=w, horizontal=FALSE) 
ed <- gedit("", cont=g) 
tbl <- gtable(d, cont=g, filter.FUN="manual", expand=TRUE) 

ourMatch <- function(curVal, vals) { 
    grepl(curVal, vals) 
} 

id <- addHandlerKeystroke(ed, handler=function(h, ...) { 
    vals <- tbl[, 1, drop=TRUE] 
    curVal <- svalue(h$obj) 
    vis <- ourMatch(curVal, vals) 
    visible(tbl) <- vis 
}) 

你的目的,你可能需要使用gcheckboxgroupgcombobox選擇因子水平或由級別和篩選器。關鍵是gtable對象的visible<-方法用於過濾顯示項。

如果你是遊戲,你可以嘗試在gWidgets2其中之爲知的就是在我的github的網站(使用install_packages("gWidgets2", "jverzani")從devtools,也gWidgets2RGtk2)的gfilter部件。這可能正是你想要做的。

+0

感謝您的代碼示例和參考! –

0

與您的數據對象和測試變量之一,這是subset.data.frame一個簡化版本:

tmp <- 
structure(list(kunde = c(3, 3, 3, 3, 3, 3, 3, 1, 3, 3), bank = c(7, 
98, 3, 3, 98, 2, 2, 1, 7, 2)), .Names = c("kunde", "bank"), row.names = c(NA, 
10L), class = "data.frame") 

getsub <- function(obj, logexpr) if (missing(logexpr)) {return(obj) 
     } else {e <- substitute(logexpr) 
     r <- eval(e, obj, parent.frame()) 
     if (!is.logical(r)) 
      stop("'subset' must evaluate to logical") 
     r <- r & !is.na(r) 
     obj[r, ] } 

getsub(tmp, bank <50) 
#-------------- 
    kunde bank 
1  3 7 
3  3 3 
4  3 3 
6  3 2 
7  3 2 
8  1 1 
9  3 7 
10  3 2 
+0

感謝您的代碼,但如何將你gwidgets實現這一點? –