Hello, I'm using the eclat function of the arules package (1.0-6) for the identification of frequent itemsets. I need the tidLists, but if I set in the function tidLists=TRUE R crashes (Windows XP Professional SP3, 32 bit, R version 2.12.1 (2010-12-16), reproducible on two different computers) with two different error messages or non at all. Minimum examples are:
library(arules) data("Adult") eclat(Adult, parameter=list(support=0.05, tidLists=FALSE)) # OK eclat(Adult, parameter=list(support=0.50, tidLists=TRUE)) # OK eclat(Adult, parameter=list(support=0.05, tidLists=TRUE)) # crashes I started to search the cause of the problem and figured out that the problem must be located in the external function reclat called in eclat.R using the source of the arules package: result <- .Call("reclat", ## transactions items@p, items@i, items@Dim, ## parameter parameter, control, data@itemInfo, PACKAGE = "arules") Then I looked into the source code of reclat.c, trying to follow the tidList=TRUE parameter, but I have no C programming experience. It looks to me that the problem may be in the item set report function "_report_R" where memory is allocated and or released (see code fragments below). My question are: a) Does anyone else can confirm the problem? b) Does anyone know, if this may be a problem of the binary package (e.g. how it was compiled) or if it is a problem of the source code for reclat? c) Does anyone know how to fix the problem and how? Thanks and regards, Dirk /*---------------------------------------------------------------------- Item Set Report Function ----------------------------------------------------------------------*/ static void _report_R (int *ids, int cnt, int supp, int *tal, void *data) { (...) if (flags & OF_LIST) { vec1 = (int*)realloc(ruleset->trnb, size1 *sizeof(int)); if (!vec1) { if (vec) free(vec); if (vec2) free(vec2); _cleanup(); error(msg(E_NOMEM));} ruleset->trnb = vec1; } (...) if (flags & OF_LIST) { /* if to list the transactions, */ h = ruleset->trtotal; if (supp < 0) { /* if bit vector representation */ for (i = 0; i < tacnt; i++) { /* traverse the bit vector */ if (h >= size2) { size2 += (size2 > BLKSIZE) ? (size2 >> 1) : BLKSIZE; vec1 = (int*)realloc(ruleset->trans, size2 *sizeof(int)); if (!vec1) { if (vec) free(vec); if (vec2) free(vec2); _cleanup(); error(msg(E_NOMEM));} ruleset->trans = vec1; } if (tal[i >> BM_SHIFT] & (1 << (i & BM_MASK))) { /*Rprintf(" %d", i+1);*/ ruleset->trans[h] = i; h++; } } } /* print the indices of set bits */ else { /* if list of transaction ids */ if ((h + supp) >= size2) { while ((h + supp) >= size2) { size2 += (size2 > BLKSIZE) ? (size2 >> 1) : BLKSIZE; } vec1 = (int*)realloc(ruleset->trans, size2 *sizeof(int)); if (!vec1) { if (vec) free(vec); if (vec2) free(vec2); _cleanup(); error(msg(E_NOMEM));} ruleset->trans = vec1; } for (i = 0; i < supp; i++) { /*Rprintf(" %d", tal[i]); */ ruleset->trans[h] = tal[i]; h++; } /* traverse and print */ } ruleset->trtotal = ruleset->trnb[ruleset->rnb] = h; } /* the transaction identifiers */ (...) ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.