[Rqda-commits] r43 - pkg pkg/R www
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Sat Dec 13 07:27:27 CET 2008
Author: wincent
Date: 2008-12-13 07:27:27 +0100 (Sat, 13 Dec 2008)
New Revision: 43
Added:
pkg/R/autoCoding.R
Modified:
pkg/ChangeLog
pkg/DESCRIPTION
pkg/R/CaseFun.R
pkg/R/CodesFun.R
pkg/R/Coding_Buttons.R
pkg/R/FileCatButton.R
pkg/R/FilesFun.R
pkg/R/GUIHandler.R
pkg/R/deletion.R
pkg/R/root_gui.R
pkg/R/utils.R
pkg/TODO
www/ChangeLog.txt
Log:
Modified: pkg/ChangeLog
===================================================================
--- pkg/ChangeLog 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/ChangeLog 2008-12-13 06:27:27 UTC (rev 43)
@@ -1,10 +1,12 @@
2008-12-12
- * Fix bugs of SortByTime(), now should work for R < 2.8.0.
+ * Fix bugs of SortByTime(), now should work for R < 2.8.0. Fix bug of GetCodingTable and SummaryCoding.
* New function of RunOnSelected. Use it to replace select.list.
* Now popup menu of add to case/ category can add multiple files at a time (Files Tab).
-
+ * New Coding Button: C2Info
+
2008-12-10
* New functions of SearchFiles.
+
2008-12-09
* New functions to summary codings: SummaryCoding, GetCodingTable.
* Add documentation.
Modified: pkg/DESCRIPTION
===================================================================
--- pkg/DESCRIPTION 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/DESCRIPTION 2008-12-13 06:27:27 UTC (rev 43)
@@ -1,8 +1,8 @@
Package: RQDA
Type: Package
Title: Qualitative Data Analysis
-Version: 0.1.5-38
-Date: 2008-12-08
+Version: 0.1.5-43
+Date: 2008-12-12
Author: HUANG Ronggui
Maintainer: HUANG Ronggui <ronggui.huang at gmail.com>
Depends: R (>= 2.5.0), DBI, RSQLite, RGtk2, gWidgets, gWidgetsRGtk2
Modified: pkg/R/CaseFun.R
===================================================================
--- pkg/R/CaseFun.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/CaseFun.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -61,7 +61,7 @@
exist <- dbGetQuery(.rqda$qdacon,sprintf("select fid from caselinkage where status=1 and fid in (%s) and caseid=%i",paste("'",fid,"'",sep="",collapse=","),caseid))
if (nrow(exist)!=length(fid)){
## write only when the selected file associated with specific case is not in the caselinkage table
- DAT <- data.frame(caseid=caseid, fid=fid[!fid %in% exist$fid], selfirst=0, selend=selend, status=1,owner=.rqda$owner,data=date(),memo='')
+ DAT <- data.frame(caseid=caseid, fid=fid[!fid %in% exist$fid], selfirst=0, selend=selend[!fid %in% exist$fid], status=1,owner=.rqda$owner,data=date(),memo='')
success <- dbWriteTable(.rqda$qdacon,"caselinkage",DAT,row.name=FALSE,append=TRUE)
## write to caselinkage table
if (!success) gmessage("Fail to write to database.")
Modified: pkg/R/CodesFun.R
===================================================================
--- pkg/R/CodesFun.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/CodesFun.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -132,8 +132,9 @@
-retrieval <- function(){
- currentCode <- svalue(.rqda$.codes_rqda)
+retrieval <- function(CodeNameWidget){
+##CodeNameWidget=.rqda$.codes_rqda
+ currentCode <- svalue(CodeNameWidget)
if (length(currentCode)!=0){
Encoding(currentCode) <- "UTF-8"
currentCid <- dbGetQuery(.rqda$qdacon,sprintf("select id from freecode where name== '%s' ",currentCode))[1,1]
Modified: pkg/R/Coding_Buttons.R
===================================================================
--- pkg/R/Coding_Buttons.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/Coding_Buttons.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -335,3 +335,37 @@
}
}
+
+CodingInfoButton <- function(label="C2Info")
+{
+ gbutton(label,handler= function(h,...) c2InfoFun())
+}
+
+c2InfoFun <- function(){
+ con <- .rqda$qdacon
+ if (is_projOpen(env=.rqda,conName="qdacon")) {
+ W <- tryCatch( get(".openfile_gui",env=.rqda), error=function(e){})
+ ## get the widget for file display. If it does not exist, then return NULL.
+ sel_index <- tryCatch(sindex(W),error=function(e) {})
+ ## if the not file is open, it doesn't work.
+ if (is.null(sel_index)) {gmessage("Open a file first!",con=TRUE)}
+ else {
+ CodeTable <- dbGetQuery(con,"select id,name from freecode where status==1")
+ SelectedFile <- svalue(.rqda$.root_edit); Encoding(SelectedFile) <- "UTF-8" ##file title
+ currentFid <- dbGetQuery(con,sprintf("select id from source where name=='%s'",SelectedFile))[,1]
+ codings_index <- dbGetQuery(con,sprintf("select rowid, cid, fid, selfirst, selend from coding where fid==%i ", currentFid))
+ ## should only work with those related to current code and current file.
+ rowid <- codings_index$rowid[(codings_index$selfirst >= sel_index$startN) &
+ (codings_index$selend <= sel_index$endN)
+ ] ## determine which codes correspond to the selection
+ cid <- codings_index$cid[codings_index$rowid %in% rowid]
+ Codes <- CodeTable$name[CodeTable$id %in% cid]
+ ## should not use data frame as x, otherwise, svalue(c2infoWidget) is a factor rather than a character
+ if (length(Codes)!=0){
+ tryCatch(dispose(.rqda$.c2info),error=function(e){})
+ gw <- gwindow(title="Associted code-list.",heigh=min(33*length(Codes),600),parent=.rqda$.openfile_gui)
+ c2infoWidget <- gtable(Codes,con=gw)
+ assign(".c2info",gw,env=.rqda)
+ addhandlerdoubleclick(c2infoWidget,handler=function(h,...) retrieval(CodeNameWidget=c2infoWidget))
+ }
+ }}}
Modified: pkg/R/FileCatButton.R
===================================================================
--- pkg/R/FileCatButton.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/FileCatButton.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -146,36 +146,37 @@
-AddToFileCategory<- function(){
- ## filenames -> fid -> selfirst=0; selend=nchar(filesource)
- filename <- svalue(.rqda$.fnames_rqda)
- Encoding(filename) <- "unknown"
- query <- dbGetQuery(.rqda$qdacon,sprintf("select id, file from source where name in(%s) and status=1",paste("'",filename,"'",sep="",collapse=","))) ## multiple fid
- fid <- query$id
- Encoding(query$file) <- "UTF-8"
+## AddToFileCategory<- function(){
+## moved to FilesFun.R
+## ## filenames -> fid -> selfirst=0; selend=nchar(filesource)
+## filename <- svalue(.rqda$.fnames_rqda)
+## Encoding(filename) <- "unknown"
+## query <- dbGetQuery(.rqda$qdacon,sprintf("select id, file from source where name in(%s) and status=1",paste("'",filename,"'",sep="",collapse=","))) ## multiple fid
+## fid <- query$id
+## Encoding(query$file) <- "UTF-8"
- ## select a F-cat name -> F-cat id
- Fcat <- dbGetQuery(.rqda$qdacon,"select catid, name from filecat where status=1")
- if (nrow(Fcat)!=0){
- Encoding(Fcat$name) <- "UTF-8"
- ##ans <- select.list(Fcat$name,multiple=FALSE)
- CurrentFrame <- sys.frame(sys.nframe())
- RunOnSelected(Fcat$name,multiple=TRUE,enclos=CurrentFrame,expr={
- if (Selected!=""){ ## must use Selected to represent the value of selected items. see RunOnSelected() for info.
- Selected <- iconv(Selected,to="UTF-8")
- Fcatid <- Fcat$catid[Fcat$name %in% Selected]
- exist <- dbGetQuery(.rqda$qdacon,sprintf("select fid from treefile where status=1 and fid in (%s) and catid=%i",paste("'",fid,"'",sep="",collapse=","),Fcatid))
- if (nrow(exist)!=length(fid)){
- ## write only when the selected file associated with specific f-cat is not there
- DAT <- data.frame(fid=fid[!fid %in% exist$fid], catid=Fcatid, date=date(),dateM=date(),memo='',status=1)
- ## should pay attention to the var order of DAT, must be the same as that of treefile table
- success <- dbWriteTable(.rqda$qdacon,"treefile",DAT,row.name=FALSE,append=TRUE)
- ## write to caselinkage table
- if (success) {
- UpdateFileofCatWidget()
- }
- if (!success) gmessage("Fail to write to database.")
- }}})}}
+## ## select a F-cat name -> F-cat id
+## Fcat <- dbGetQuery(.rqda$qdacon,"select catid, name from filecat where status=1")
+## if (nrow(Fcat)==0){gmessage("Add File Categroy first.",con=TRUE)} else{
+## Encoding(Fcat$name) <- "UTF-8"
+## ##ans <- select.list(Fcat$name,multiple=FALSE)
+## CurrentFrame <- sys.frame(sys.nframe())
+## RunOnSelected(Fcat$name,multiple=TRUE,enclos=CurrentFrame,expr={
+## if (Selected!=""){ ## must use Selected to represent the value of selected items. see RunOnSelected() for info.
+## Selected <- iconv(Selected,to="UTF-8")
+## Fcatid <- Fcat$catid[Fcat$name %in% Selected]
+## exist <- dbGetQuery(.rqda$qdacon,sprintf("select fid from treefile where status=1 and fid in (%s) and catid=%i",paste("'",fid,"'",sep="",collapse=","),Fcatid))
+## if (nrow(exist)!=length(fid)){
+## ## write only when the selected file associated with specific f-cat is not there
+## DAT <- data.frame(fid=fid[!fid %in% exist$fid], catid=Fcatid, date=date(),dateM=date(),memo='',status=1)
+## ## should pay attention to the var order of DAT, must be the same as that of treefile table
+## success <- dbWriteTable(.rqda$qdacon,"treefile",DAT,row.name=FALSE,append=TRUE)
+## ## write to caselinkage table
+## if (success) {
+## UpdateFileofCatWidget()
+## }
+## if (!success) gmessage("Fail to write to database.")
+## }}})}}
Modified: pkg/R/FilesFun.R
===================================================================
--- pkg/R/FilesFun.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/FilesFun.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -286,3 +286,36 @@
)
fid
}
+
+
+AddToFileCategory<- function(){
+ ## filenames -> fid -> selfirst=0; selend=nchar(filesource)
+ filename <- svalue(.rqda$.fnames_rqda)
+ Encoding(filename) <- "unknown"
+ query <- dbGetQuery(.rqda$qdacon,sprintf("select id, file from source where name in(%s) and status=1",paste("'",filename,"'",sep="",collapse=","))) ## multiple fid
+ fid <- query$id
+ Encoding(query$file) <- "UTF-8"
+
+ ## select a F-cat name -> F-cat id
+ Fcat <- dbGetQuery(.rqda$qdacon,"select catid, name from filecat where status=1")
+ if (nrow(Fcat)==0){gmessage("Add File Categroy first.",con=TRUE)} else{
+ Encoding(Fcat$name) <- "UTF-8"
+ ##ans <- select.list(Fcat$name,multiple=FALSE)
+ CurrentFrame <- sys.frame(sys.nframe())
+ RunOnSelected(Fcat$name,multiple=TRUE,enclos=CurrentFrame,expr={
+ if (Selected!=""){ ## must use Selected to represent the value of selected items. see RunOnSelected() for info.
+ Selected <- iconv(Selected,to="UTF-8")
+ Fcatid <- Fcat$catid[Fcat$name %in% Selected]
+ exist <- dbGetQuery(.rqda$qdacon,sprintf("select fid from treefile where status=1 and fid in (%s) and catid=%i",paste("'",fid,"'",sep="",collapse=","),Fcatid))
+ if (nrow(exist)!=length(fid)){
+ ## write only when the selected file associated with specific f-cat is not there
+ DAT <- data.frame(fid=fid[!fid %in% exist$fid], catid=Fcatid, date=date(),dateM=date(),memo='',status=1)
+ ## should pay attention to the var order of DAT, must be the same as that of treefile table
+ success <- dbWriteTable(.rqda$qdacon,"treefile",DAT,row.name=FALSE,append=TRUE)
+ ## write to caselinkage table
+ if (success) {
+ UpdateFileofCatWidget()
+ }
+ if (!success) gmessage("Fail to write to database.")
+ }}})}}
+
Modified: pkg/R/GUIHandler.R
===================================================================
--- pkg/R/GUIHandler.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/GUIHandler.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -76,7 +76,7 @@
## )
addhandlerdoubleclick(.rqda$.codes_rqda,handler=function(h,...) {
- if (is_projOpen(env=.rqda,conName="qdacon")) retrieval()
+ if (is_projOpen(env=.rqda,conName="qdacon")) retrieval(.rqda$.codes_rqda)
}
)
add3rdmousepopupmenu(.rqda$.codes_rqda,CodesNamesWidgetMenu)
Added: pkg/R/autoCoding.R
===================================================================
--- pkg/R/autoCoding.R (rev 0)
+++ pkg/R/autoCoding.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -0,0 +1,11 @@
+AutoCoding <- function(KeyWord,expansion=6){
+ Files <- SearchFiles(paste("%",KeyWordm,"%",collapse=""),content=TRUE)
+ AnsIndex <- gregexpr(KeyWord,Files$file)
+ AnsIndex2 <- lapply(AnsIndex, FUN=function(x) {
+ begin <- x-expansion
+ begin[begin<0]<-0
+ data.frame(begin=begin,end=x+attr(x,"match.length"))
+ })
+ ## if any index > nchar(Files$file), set to nchar(Files$file)
+ ## for each file, simplify the coding index, so erase the overlapping codings or proximity with distance=0
+}
Modified: pkg/R/deletion.R
===================================================================
--- pkg/R/deletion.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/deletion.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -124,7 +124,7 @@
print("Nothing to clear.")
} else {
if (ask){
- del <- select.list(del[,1],multiple=TRUE)
+ del <- select(del[,1],multiple=TRUE)$selected ##select.list(del[,1],multiple=TRUE)
} else {
del <- del[,1]
}
@@ -228,7 +228,7 @@
print("Nothing to clear.")
} else {
if (ask){
- del <- select.list(del[,1],multiple=TRUE)
+ del <- select(del[,1],multiple=TRUE)$selected ##select.list(del[,1],multiple=TRUE)
} else {
del <- del[,1]
}
Modified: pkg/R/root_gui.R
===================================================================
--- pkg/R/root_gui.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/root_gui.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -69,6 +69,7 @@
.codes_button[1,3] <- FreeCode_RenameButton(label="Rename",CodeNamesWidget=.codes_rqda)
.codes_button[1,4] <- CodeMemoButton(label="C-Memo")
.codes_button[1,5]<- CodingMemoButton(label="C2Memo")
+ .codes_button[2,1]<- CodingInfoButton()
.codes_button[2,2]<- HL_ALLButton()
# .codes_button[2,2]<- RetrievalButton("Retrieval")
.codes_button[2,3]<- ExtendButton("Retrieval")
Modified: pkg/R/utils.R
===================================================================
--- pkg/R/utils.R 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/R/utils.R 2008-12-13 06:27:27 UTC (rev 43)
@@ -1,23 +1,24 @@
-OrderByTime <- function(date,decreasing = FALSE){
-## return tbe permutation of the date which is get by sql "select date from ..."
-## see order for the meaning of permutation. It can be used as index to sort vector or date frame
-oldLCTIME<- Sys.getlocale("LC_TIME")
-Sys.setlocale("LC_TIME","C")
-on.exit(Sys.setlocale("LC_TIME",oldLCTIME))
-Newdate <- strptime(date, "%a %b %d %H:%M:%S %Y")
-permutation <- order(Newdate,decreasing = decreasing)
+OrderByTime <- function(date,decreasing = FALSE)
+{
+ ## return tbe permutation of the date which is get by sql "select date from ..."
+ ## see order for the meaning of permutation. It can be used as index to sort vector or date frame
+ ## if (getRversion()<"2.8.0"){
+ ## permutation <- ifelse(decreasing,1:length(date),length(date):1)
+ ## ## should rewrite it when project merge is provided.
+ ## } else{
+ ## Work for R.2.8.0 or above for Dateclass,so convert to character
+ oldLCTIME<- Sys.getlocale("LC_TIME")
+ Sys.setlocale("LC_TIME","C")
+ on.exit(Sys.setlocale("LC_TIME",oldLCTIME))
+ Newdate <- as.character(strptime(date, "%a %b %d %H:%M:%S %Y"))
+ permutation <- order(Newdate,decreasing = decreasing)
+ ## }
}
## dd<- dbGetQuery(.rqda$qdacon,"select date from source")$date
## sort(dd) == dd[order(dd)] ## but the order is not correct.
## dd[OrderByTime(dd)]
-setEncoding <- function(encoding="unknown"){
- ## specify what encoding is used in the imported files.
- .rqda$encoding <- encoding
-}
-
-
MemoWidget <- function(prefix,widget,dbTable){
## prefix of window tile. E.g. "Code" -> tile of gwindow becomes "Code Memo:"
## widget of the F-cat/C-cat list, such as widget=.rqda$.fnames_rqda
@@ -56,18 +57,25 @@
## summary coding information
GetCodingTable <- function(){
## test when any table is empty
+ ## http://archives.postgresql.org/pgsql-sql/2004-01/msg00160.php
if ( isIdCurrent(.rqda$qdacon)) {
- Codings <- dbGetQuery(.rqda$qdacon,"select freecode.name as codename, freecode.id as cid,
- coding.cid as cid2,coding.fid as fid,source.id as fid2, source.name as filename,
- coding.selend - coding.selfirst as CodingLength,coding.selend, coding.selfirst
- from coding, freecode, source
- where coding.status==1 and freecode.id=coding.cid and coding.fid=source.id")
+ ## Codings <- dbGetQuery(.rqda$qdacon,"select freecode.name as codename, freecode.id as cid,
+ ## coding.cid as cid2,coding.fid as fid,source.id as fid2, source.name as filename,
+ ## coding.selend - coding.selfirst as CodingLength,coding.selend, coding.selfirst
+ ## from coding, freecode, source
+ ## where coding.status==1 and freecode.id=coding.cid and coding.fid=source.id")
+ Codings <- dbGetQuery(.rqda$qdacon,"select coding.cid, coding.fid, freecode.name as codename, source.name as filename,
+ coding.selend - coding.selfirst as CodingLength
+ from coding left join freecode on (coding.cid=freecode.id)
+ left join source on (coding.fid=source.id)
+ where coding.status==1 and source.status=1 and freecode.status=1")
+
if (nrow(Codings)!=0){
Encoding(Codings$codename) <- Encoding(Codings$filename) <- "UTF-8"
}
- if (!all (all.equal(Codings$cid,Codings$cid2),all.equal(Codings$fid,Codings$fid2))){
- stop("Errors!") ## check to make sure the sql is correct
- }
+ ## if (!all (all.equal(Codings$cid,Codings$cid2),all.equal(Codings$fid,Codings$fid2))){
+ ## stop("Errors!") ## check to make sure the sql is correct
+ ## }
Codings
} else cat("Open a project first.\n")
}
@@ -78,7 +86,7 @@
if (nrow(Codings)>0){
NumOfCoding <- table(Codings$codename,...) ## how many coding for each code
AvgLength <- tapply(Codings$CodingLength,Codings$codename,FUN=mean,...) # Average of words for each code
- NumOfFile <- tapply(Codings$fid1,Codings$codename,FUN=length,...) # Number of files for each code
+ NumOfFile <- tapply(Codings$fid,Codings$codename,FUN=length,...) # Number of files for each code
if (byFile){
CodingOfFile <- tapply(Codings$codename,Codings$filename,FUN=table,...) # summary of codings for each file
} else CodingOfFile <- NULL
@@ -110,3 +118,65 @@
cat("Number of files associated with each code.\n\n")
print(x$NumOfFile)
}
+
+
+SearchFiles <- function(pattern,content=FALSE,Widget=NULL,is.UTF8=FALSE){
+##SearchFiles("file like '%ÐÂÃñÍí±¨%'")
+##SearchFiles("name like '%ÎïȨ·¨%'")
+##SearchFiles("file like '%ÐÂÃñÍí±¨%'",Widget=.rqda$.fnames_rqda)
+ if ( isIdCurrent(.rqda$qdacon)) {
+if(!is.UTF8){
+pattern <- iconv(pattern,to="UTF-8")
+}
+Encoding(pattern) <- "unknown"
+if (content){
+ans <- dbGetQuery(.rqda$qdacon,sprintf("select id, name,file from source where status==1 and %s",pattern))
+} else {
+ans <- dbGetQuery(.rqda$qdacon,sprintf("select id, name from source where status==1 and %s",pattern))
+}
+if (nrow(ans)>0) Encoding(ans$name) <- "UTF-8"
+if (!is.null(ans$file)) Encoding(ans$file) <- "UTF-8"
+if (!is.null(Widget)) eval(substitute(widget[] <- ans$name,list(widget=quote(Widget))))
+invisible(ans)
+ } else cat("Open a project first.\n")
+}
+
+select <- function(x,multiple=TRUE,title=NULL,...){
+## select a method for selecting items conditional on the OS, to maxizied the chance of GUI-style of selection.
+## use as replacement of select.list.
+ if (.Platform$OS.type == "unix" && capabilities("tcltk") && capabilities("X11"))
+ {
+ ans <- tcltk::tk_select.list(x,multiple=multiple,title=title,...)
+ } else {
+ ans <- select.list(x,multiple=multiple,title=title,...)
+ }
+ return(list(selected=ans))
+}
+
+
+RunOnSelected <- function(x,multiple=TRUE,expr,enclos,title=NULL,...){
+ if (is.null(title)) title <- ifelse(multiple,"Select one or more","Select one")
+ g <- gwindow(title=title,wid=250,heigh=600,parent=c(395, 10))
+ x1<-ggroup(FALSE,con=g)
+ ##x1 at widget@widget$parent$parent$parent$SetTitle(title)
+ ##x1 at widget@widget$parent$parent$parent$SetDefaultSize(200, 500)
+ x2<-gtable(x,multiple=multiple,con=x1,expand=TRUE)
+ gbutton("Cancel",con=x1,handler=function(h,...){
+ dispose(x1)
+ })
+ gbutton("OK",con=x1,handler=function(h,...){
+ Selected <- svalue(x2)
+ if (Selected!=""){
+ eval(h$action$expr,env=pairlist(Selected=Selected),enclos=h$action$enclos)
+ ## evaluate expr in env
+ ## Variable Selected will be found in env
+ ## because env is parilist and there are variables not there, which will be found in enclos.
+ dispose(g)
+ } else gmessage("Select before Click OK.\n",con=TRUE,icon="error")
+ },
+ action=list(expr=substitute(expr),enclos=enclos)
+ )
+ invisible()
+}
+
+
Modified: pkg/TODO
===================================================================
--- pkg/TODO 2008-12-13 03:06:09 UTC (rev 42)
+++ pkg/TODO 2008-12-13 06:27:27 UTC (rev 43)
@@ -1,7 +1,7 @@
+*Todo
+
documentation
-summary functions for review of coding.
-
Merge *rqda from different coders
inter-coder reliability
Modified: www/ChangeLog.txt
===================================================================
--- www/ChangeLog.txt 2008-12-13 03:06:09 UTC (rev 42)
+++ www/ChangeLog.txt 2008-12-13 06:27:27 UTC (rev 43)
@@ -1,3 +1,12 @@
+2008-12-12
+ * Fix bugs of SortByTime(), now should work for R < 2.8.0. Fix bug of GetCodingTable and SummaryCoding.
+ * New function of RunOnSelected. Use it to replace select.list.
+ * Now popup menu of add to case/ category can add multiple files at a time (Files Tab).
+ * New Coding Button: C2Info
+
+2008-12-10
+ * New functions of SearchFiles.
+
2008-12-09
* New functions to summary codings: SummaryCoding, GetCodingTable.
* Add documentation.
More information about the Rqda-commits
mailing list