Last active
December 17, 2015 07:59
-
-
Save masaha03/5577124 to your computer and use it in GitHub Desktop.
GUI for read.table
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(RGtk2) | |
ti <- new("TextImporter") | |
df1 <- ti$run() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setRefClass("TextImporter", | |
fields = c("widget", "win", "filepath", "data"), | |
methods = list( | |
initialize = function(...) { | |
initFields(...) | |
data <<- NULL | |
if(class(win)[[1]] == "uninitializedField") { | |
win <<- NULL | |
} | |
encode.label <- gtkLabelNew(gettext("Character code")) | |
encode.sep1 <- gtkHSeparatorNew() | |
encode.lab.hbox <- gtkHBoxNew(spacing=4) | |
encode.lab.hbox$packStart(encode.label, expand=FALSE) | |
encode.lab.hbox$packStart(encode.sep1, expand=TRUE, fill=TRUE) | |
encode1 <- gtkComboBoxNewText() | |
for(i in iconvlist()) encode1$appendText(i) | |
index <- which(localeToCharset()[1]==iconvlist()) - 1 | |
if(length(index)==0) index <- -1 | |
encode1$setActive(index) | |
encode.hbox <- gtkHBoxNew(spacing=5) | |
encode.hbox$packStart(encode1, expand=FALSE) | |
header.label <- gtkLabelNew(gettext("Header")) | |
header.sep1 <- gtkHSeparatorNew() | |
header.lab.hbox <- gtkHBoxNew(spacing=4) | |
header.lab.hbox$packStart(header.label, expand=FALSE) | |
header.lab.hbox$packStart(header.sep1, expand=TRUE, fill=TRUE) | |
header1 <- gtkRadioButtonNewWithLabel(NULL, "TRUE") | |
header1$setData("value", TRUE) | |
header2 <- gtkRadioButtonNewWithLabelFromWidget(header1, "FALSE") | |
header2$setData("value", FALSE) | |
header.hbox <- gtkHBoxNew(spacing=5) | |
header.hbox$packStart(header1, expand=FALSE) | |
header.hbox$packStart(header2, expand=FALSE) | |
sepchar.label <- gtkLabelNew(gettext("Separator")) | |
sepchar.sep1 <- gtkHSeparatorNew() | |
sepchar.lab.hbox <- gtkHBoxNew(spacing=4) | |
sepchar.lab.hbox$packStart(sepchar.label, expand=FALSE) | |
sepchar.lab.hbox$packStart(sepchar.sep1, expand=TRUE, fill=TRUE) | |
sepchar1 <- gtkRadioButtonNewWithLabel(NULL, gettext("Comma")) | |
sepchar1$setData("value", ",") | |
sepchar2 <- gtkRadioButtonNewWithLabelFromWidget(sepchar1, gettext("Whitespace")) | |
sepchar2$setData("value", " ") | |
sepchar3 <- gtkRadioButtonNewWithLabelFromWidget(sepchar1, gettext("Tab")) | |
sepchar3$setData("value", "\t") | |
sepchar4 <- gtkRadioButtonNewWithLabelFromWidget(sepchar1, gettext("Semicolon")) | |
sepchar4$setData("value", ";") | |
sepchar5 <- gtkRadioButtonNewWithLabelFromWidget(sepchar1, gettext("Other:")) | |
sepchar5$setData("value", "") | |
sepchar.entry <- gtkEntryNew() | |
sepchar.entry$setWidthChars(4) | |
sepchar.hbox <- gtkHBoxNew(spacing=5) | |
sepchar.hbox$packStart(sepchar5, expand=FALSE) | |
sepchar.hbox$packStart(sepchar.entry, expand=FALSE) | |
missing.label <- gtkLabelNew(gettext("Missing")) | |
missing.sep1 <- gtkHSeparatorNew() | |
missing.lab.hbox <- gtkHBoxNew(spacing=4) | |
missing.lab.hbox$packStart(missing.label, expand=FALSE) | |
missing.lab.hbox$packStart(missing.sep1, expand=TRUE, fill=TRUE) | |
missing1 <- gtkRadioButtonNewWithLabel(NULL, gettext("Whitespace")) | |
missing1$setData("value", " ") | |
missing2 <- gtkRadioButtonNewWithLabelFromWidget(missing1, gettext("Blank")) | |
missing2$setData("value", "") | |
missing3 <- gtkRadioButtonNewWithLabelFromWidget(missing1, gettext("Period")) | |
missing3$setData("value", ".") | |
missing4 <- gtkRadioButtonNewWithLabelFromWidget(missing1, gettext("\"NA\"")) | |
missing4$setData("value", "NA") | |
missing5 <- gtkRadioButtonNewWithLabelFromWidget(missing1, gettext("Other:")) | |
missing5$setData("value", "") | |
missing.entry <- gtkEntryNew() | |
missing.entry$setWidthChars(4) | |
missing.hbox <- gtkHBoxNew(spacing=5) | |
missing.hbox$packStart(missing5, expand=FALSE) | |
missing.hbox$packStart(missing.entry, expand=FALSE) | |
decimal.label <- gtkLabelNew(gettext("Decimal")) | |
decimal.sep1 <- gtkHSeparatorNew() | |
decimal.lab.hbox <- gtkHBoxNew(spacing=4) | |
decimal.lab.hbox$packStart(decimal.label, expand=FALSE) | |
decimal.lab.hbox$packStart(decimal.sep1, expand=TRUE, fill=TRUE) | |
decimal1 <- gtkRadioButtonNewWithLabel(NULL, gettext("Period")) | |
decimal1$setData("value", ".") | |
decimal2 <- gtkRadioButtonNewWithLabelFromWidget(decimal1, gettext("Comma")) | |
decimal2$setData("value", ",") | |
decimal.hbox <- gtkHBoxNew(spacing=5) | |
decimal.hbox$packStart(decimal1, expand=FALSE) | |
decimal.hbox$packStart(decimal2, expand=FALSE) | |
quote.label <- gtkLabelNew(gettext("Quote")) | |
quote.sep1 <- gtkHSeparatorNew() | |
quote.lab.hbox <- gtkHBoxNew(spacing=4) | |
quote.lab.hbox$packStart(quote.label, expand=FALSE) | |
quote.lab.hbox$packStart(quote.sep1, expand=TRUE, fill=TRUE) | |
quote1 <- gtkRadioButtonNewWithLabel(NULL, gettext("Double quote (\")")) | |
quote1$setData("value", "\"") | |
quote2 <- gtkRadioButtonNewWithLabelFromWidget(quote1, gettext("Single quote (')")) | |
quote2$setData("value", "'") | |
quote3 <- gtkRadioButtonNewWithLabelFromWidget(quote1, gettext("None")) | |
quote3$setData("value", "") | |
vbox.options <- gtkVBoxNew(homogeneous=FALSE,spacing=2) | |
vbox.options$setBorderWidth(5) | |
vbox.options$packStart(encode.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(encode.hbox, expand=FALSE) | |
vbox.options$packStart(header.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(header.hbox, expand=FALSE) | |
vbox.options$packStart(sepchar.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(sepchar1, expand=FALSE) | |
vbox.options$packStart(sepchar2, expand=FALSE) | |
vbox.options$packStart(sepchar3, expand=FALSE) | |
vbox.options$packStart(sepchar4, expand=FALSE) | |
vbox.options$packStart(sepchar.hbox, expand=FALSE) | |
vbox.options$packStart(missing.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(missing1, expand=FALSE) | |
vbox.options$packStart(missing2, expand=FALSE) | |
vbox.options$packStart(missing3, expand=FALSE) | |
vbox.options$packStart(missing4, expand=FALSE) | |
vbox.options$packStart(missing.hbox, expand=FALSE) | |
vbox.options$packStart(decimal.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(decimal.hbox, expand=FALSE) | |
vbox.options$packStart(quote.lab.hbox, expand=FALSE, padding=3) | |
vbox.options$packStart(quote1, expand=FALSE) | |
vbox.options$packStart(quote2, expand=FALSE) | |
vbox.options$packStart(quote3, expand=FALSE) | |
textview <- gtkTextViewNewWithBuffer() | |
sw1 <- gtkScrolledWindowNew() | |
sw1$setPolicy(GtkPolicyType["automatic"], GtkPolicyType["automatic"]) | |
sw1$setShadowType(GtkShadowType["in"]) | |
sw1$add(textview) | |
textview.label <- gtkLabelNew(gettext("Input File (first 20 Lines)")) | |
textview.hbox <- gtkHBoxNew() | |
textview.hbox$packStart(textview.label, expand=FALSE) | |
vbox.textview <- gtkVBoxNew(spacing=2) | |
vbox.textview$packStart(textview.hbox, expand=FALSE) | |
vbox.textview$packStart(sw1, expand=TRUE) | |
treeview <- gtkTreeViewNew() | |
sw2 <- gtkScrolledWindowNew() | |
sw2$setPolicy(GtkPolicyType["automatic"], GtkPolicyType["automatic"]) | |
sw2$setShadowType(GtkShadowType["in"]) | |
sw2$add(treeview) | |
treeview.label <- gtkLabelNew(gettext("Preview (first 20 rows)")) | |
treeview.hbox <- gtkHBoxNew() | |
treeview.hbox$packStart(treeview.label, expand=FALSE) | |
vbox.treeview <- gtkVBoxNew(spacing=2) | |
vbox.treeview$packStart(treeview.hbox, expand=FALSE) | |
vbox.treeview$packStart(sw2, expand=TRUE) | |
paned1 <- gtkVPanedNew() | |
paned1$pack1(vbox.textview) | |
paned1$pack2(vbox.treeview) | |
paned1$setPosition(240) | |
paned1$setBorderWidth(5) | |
paned2 <- gtkHPanedNew() | |
paned2$pack1(vbox.options) | |
paned2$pack2(paned1) | |
widget <<- gtkDialogNewWithButtons(title="Options", | |
parent=win, | |
flags=5, | |
"gtk-ok", GtkResponseType["accept"], | |
"gtk-cancel", GtkResponseType["reject"], | |
show=FALSE) | |
widget$setSizeRequest(600, -1) | |
widget[["vbox"]]$add(paned2) | |
reload <- function(...) { | |
encode <- localize(encode1$getActiveText()) | |
con <- file(filepath, encoding=encode) | |
input <- paste(readLines(con, n=20), collapse="\n") | |
preview <- read.table(con, nrows=20, | |
header=getActiveData(header1), | |
sep=getActiveData(sepchar1), | |
na.strings=getActiveData(missing1), | |
quote=getActiveData(quote1), | |
dec=getActiveData(decimal1)) | |
textview$getBuffer()$setText(input) | |
lapply(treeview$getColumns(), treeview$removeColumn) | |
treeview$setModel(rGtkDataFrame(preview)) | |
renderer <- gtkCellRendererTextNew() | |
for (i in seq_len(ncol(preview))) { | |
column <- gtkTreeViewColumnNewWithAttributes( | |
title=colnames(preview)[i], | |
cell=renderer, text=i-1) | |
treeview$appendColumn(column) | |
} | |
} | |
gSignalConnect(encode1, "changed", reload) | |
gSignalConnect(header1, "toggled", reload) | |
gSignalConnect(header2, "toggled", reload) | |
gSignalConnect(sepchar1, "toggled", reload) | |
gSignalConnect(sepchar2, "toggled", reload) | |
gSignalConnect(sepchar3, "toggled", reload) | |
gSignalConnect(sepchar4, "toggled", reload) | |
gSignalConnect(sepchar5, "toggled", reload) | |
gSignalConnect(missing1, "toggled", reload) | |
gSignalConnect(missing2, "toggled", reload) | |
gSignalConnect(missing3, "toggled", reload) | |
gSignalConnect(missing4, "toggled", reload) | |
gSignalConnect(missing5, "toggled", reload) | |
gSignalConnect(decimal1, "toggled", reload) | |
gSignalConnect(decimal2, "toggled", reload) | |
gSignalConnect(quote1, "toggled", reload) | |
gSignalConnect(quote2, "toggled", reload) | |
gSignalConnect(quote3, "toggled", reload) | |
gSignalConnect(sepchar.entry, "changed", function(...){ | |
text <- localize(sepchar.entry$getText()) | |
sepchar5$setData("value", text) | |
sepchar5$setActive(TRUE) | |
}) | |
gSignalConnect(missing.entry, "changed", function(...){ | |
text <- localize(missing.entry$getText()) | |
missing5$setData("value", text) | |
missing5$setActive(TRUE) | |
}) | |
gSignalConnect(widget, "show", reload) | |
gSignalConnect(widget, "delete-event", function(...){ | |
widget$hide() | |
return(TRUE) | |
}) | |
gSignalConnect(widget, "response", function(widget, response){ | |
widget$hide() | |
if (response == GtkResponseType["accept"]) { | |
data <<- read.table(filepath, nrows=20, | |
header=getActiveData(header1), | |
sep=getActiveData(sepchar1), | |
na.strings=getActiveData(missing1), | |
quote=getActiveData(quote1), | |
dec=getActiveData(decimal1), | |
fileEncoding=localize(encode1$getActiveText())) | |
} else { | |
data <<- NULL | |
} | |
}) | |
}, | |
getActiveData = function(radio) { | |
group <- radio$getGroup() | |
result <- sapply(group, | |
function(x) if(x$getActive()) x$getData("value")) | |
result <- unlist(result) | |
return(result) | |
}, | |
run = function(filepath) { | |
dialog <- gtkFileChooserDialogNew(title=gettext("Select text file"), | |
parent=win, | |
action=GtkFileChooserAction["open"], | |
"gtk-open", GtkResponseType["accept"], | |
"gtk-cancel", GtkResponseType["cancel"], | |
show=FALSE) | |
response <- dialog$run() | |
dialog$hide() | |
if (response != GtkResponseType["accept"]) { | |
return(NULL) | |
} else { | |
filepath <<- localize(dialog$getFilename()) | |
widget$run() | |
return(data) | |
} | |
}, | |
localize = function(char) iconv(char, "UTF-8", localeToCharset()[1]) | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment