rggobi/0000755000175100001440000000000012761623067011553 5ustar hornikusersrggobi/configure.in0000644000175100001440000000073012325763563014066 0ustar hornikusersdnl This just builds Rggobi assuming GGobi is already installed. AC_INIT(src/brush.c) AC_ARG_WITH(ggobi,Specify where ggobi pkgconfig file is located, GGOBI_ROOT=$withval) dnl Get the compiler flags. dnl If the GGOBI_ROOT contains a ggobi.pc, we reference that if ! test -z "${GGOBI_ROOT}"; then export PKG_CONFIG_PATH=${GGOBI_ROOT}:$PKG_CONFIG_PATH fi PKG_CHECK_MODULES(GGOBI, [ggobi >= 2.1.6]) AC_SUBST(GGOBI_CFLAGS) AC_SUBST(GGOBI_LIBS) AC_OUTPUT(src/Makevars) rggobi/src/0000755000175100001440000000000012761555755012352 5ustar hornikusersrggobi/src/io.c0000644000175100001440000000230312761555755013123 0ustar hornikusers#include "RSGGobi.h" #include extern XmlWriteInfo *updateXmlWriteInfo(GGobiData *d, ggobid *gg, XmlWriteInfo *info); USER_OBJECT_ RS_GGOBI(writeDatasetsXML)(USER_OBJECT_ datasetIds, USER_OBJECT_ filename) { FILE *f; XmlWriteInfo info = {0, }; GGobiData *d; ggobid *gg; gint i = 0; g_return_val_if_fail(GET_LENGTH(datasetIds) > 0, NULL_USER_OBJECT); /* we take the ggobid from the first dataset */ /* i don't know what would happen if you had datasets from different ggobis */ /* we shouldn't even need a ggobi here, but ggobi is not perfect (yet) */ d = toData(VECTOR_ELT(datasetIds, i)); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); f = fopen(CHAR_DEREF(STRING_ELT(filename, 0)), "w"); gg->save.edges_p = TRUE; info.useDefault = TRUE; write_xml_header(f, -1, gg, &info); for (i = 0; i < GET_LENGTH(datasetIds); i++) { d = toData(VECTOR_ELT(datasetIds, i)); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); updateXmlWriteInfo(d, gg, &info); write_xml_dataset(f, d, gg, &info); } write_xml_footer(f, gg, &info); fclose(f); return(NULL_USER_OBJECT); } rggobi/src/RSGGobiEntryPoints.h0000644000175100001440000001504712761555755016205 0ustar hornikusers#ifndef RSGGOBI_ENTRY_POINTS #define RSGGOBI_ENTRY_POINTS void RS_GGOBI(getNumGGobiInstances)(guint *ans); USER_OBJECT_ RS_GGOBI(getNumDisplays)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getNumberedKeyHandler)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setNumberedKeyHandler)(USER_OBJECT_ handler, USER_OBJECT_ sdescription, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getNumPlotsInDisplay)(USER_OBJECT_ dpy); SEXP RS_GGOBI(getDisplayType)(SEXP dpy, SEXP ggobiId); USER_OBJECT_ RS_GGOBI(getDisplayTypes)(); USER_OBJECT_ RS_GGOBI(updateDisplay)(USER_OBJECT_ dpy, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setRowNames)(USER_OBJECT_ names, USER_OBJECT_ indices, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getRowNames)(USER_OBJECT_ data); USER_OBJECT_ RS_GGOBI(getRowsInPlot)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getSampledIndices)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setSampledIndices)(USER_OBJECT_ vals, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getExcludedIndices)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setExcludedIndices)(USER_OBJECT_ vals, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setIMode)(USER_OBJECT_ name, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setPMode)(USER_OBJECT_ name, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getIModeName)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getPModeName)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setBrushColor)(USER_OBJECT_ cid, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getBrushColor)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setBrushGlyph)(USER_OBJECT_ vals, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getBrushGlyph)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setCasesHidden)(USER_OBJECT_ vals, USER_OBJECT_ which, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getCasesHidden)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(addVariable)(USER_OBJECT_ vals, USER_OBJECT_ name, USER_OBJECT_ levels, USER_OBJECT_ values, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(varpanel_populate)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(GGobiData_init)(USER_OBJECT_ cleanup, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setVariableValues)(USER_OBJECT_ vals, USER_OBJECT_ rowIds, USER_OBJECT_ colId, USER_OBJECT_ update, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setVariableNames)(USER_OBJECT_ vars, USER_OBJECT_ names, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(raiseOrLowerDisplays)(USER_OBJECT_ displays, USER_OBJECT_ iconify, USER_OBJECT_ raise, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getVariables)(USER_OBJECT_ which, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getMainWindow)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getCurrentDisplay)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getPlugins)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getPluginInfo)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getDatasetNames)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getVariableNames)(USER_OBJECT_ transformed, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getActiveColorScheme)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(setActiveColorScheme)(USER_OBJECT_ id, USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(addColorScheme)(USER_OBJECT_ sscheme, USER_OBJECT_ name, USER_OBJECT_ overwrite, USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(setDisplaySize)(USER_OBJECT_ newDims, USER_OBJECT_ displayId, USER_OBJECT_ ggobiID); USER_OBJECT_ RS_GGOBI(setEdges)(USER_OBJECT_ x, USER_OBJECT_ y, USER_OBJECT_ append, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getDatasetRecordIds)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getData)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setFile)(USER_OBJECT_ fileName, USER_OBJECT_ smode, USER_OBJECT_ add, USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(getNumDatasets)(USER_OBJECT_ gobiID); USER_OBJECT_ RS_GGOBI(getSourceName)(USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getDisplayDataset)(USER_OBJECT_ dpy); USER_OBJECT_ RS_GGOBI(getDataset)(USER_OBJECT_ which, USER_OBJECT_ gobiID); USER_OBJECT_ RS_GGOBI(getCurrentDisplayType)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getDisplayOptions)(USER_OBJECT_ which); USER_OBJECT_ RS_GGOBI(setDisplayOptions)(USER_OBJECT_ which, USER_OBJECT_ values); USER_OBJECT_ RS_GGOBI(getActivePlot)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setActivePlot)(USER_OBJECT_ which, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(closeDisplay)(USER_OBJECT_ ref, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getDescription)(USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setCaseGlyphs)(USER_OBJECT_ vals, USER_OBJECT_ sizes, USER_OBJECT_ which, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setCaseColors)(USER_OBJECT_ vals, USER_OBJECT_ which, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getCaseColors)(USER_OBJECT_ ids, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getCaseGlyphs)(USER_OBJECT_ ids, USER_OBJECT_ datasetID); USER_OBJECT_ RS_GGOBI(close)(USER_OBJECT_ gobi); USER_OBJECT_ RS_GGOBI(isValid)(USER_OBJECT_ gobi); USER_OBJECT_ RS_GGOBI(createEdgeDataset)(USER_OBJECT_ numPoints, USER_OBJECT_ sname, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(getConnectedEdges)(USER_OBJECT_ edgesetId, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getSymbolicEdges)(USER_OBJECT_ edgesetId); USER_OBJECT_ RS_GGOBI(getMainMenubar)(USER_OBJECT_ gobi); USER_OBJECT_ RS_GGOBI(getDisplayMenubar)(USER_OBJECT_ display, USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(setDisplayEdges)(USER_OBJECT_ dpys, USER_OBJECT_ edgeData, USER_OBJECT_ directed, USER_OBJECT_ On, USER_OBJECT_ ggobiId); USER_OBJECT_ RS_GGOBI(setBrushSize)(USER_OBJECT_ dims, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setBrushLocation)(USER_OBJECT_ loc, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getColorSchemes)(USER_OBJECT_ gobiId); USER_OBJECT_ RS_GGOBI(init)(USER_OBJECT_ args, USER_OBJECT_ createInstance); SEXP RS_GGOBI(createPlots)(SEXP plotDescList, SEXP dims, SEXP cells, SEXP gobiId, SEXP rdisplay, SEXP dataset); USER_OBJECT_ RS_GGOBI(setDisplayVariables)(USER_OBJECT_ vars, USER_OBJECT_ varPrev, USER_OBJECT_ dpy); void RS_GGOBI(getNumGGobiInstances)(guint *ans); void RS_GGOBI(flush)(); USER_OBJECT_ RS_GGOBI(setVariableTypes)(USER_OBJECT_ vars, USER_OBJECT_ values, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(setAsTimeVariables)(USER_OBJECT_ vars, USER_OBJECT_ values, USER_OBJECT_ datasetId); USER_OBJECT_ RS_GGOBI(getIModeNames)(USER_OBJECT_ s_type_name); USER_OBJECT_ RS_GGOBI(getPModeNames)(USER_OBJECT_ s_type_name); USER_OBJECT_ RS_GGOBI(setPlotScale)(USER_OBJECT_ x, USER_OBJECT_ y, USER_OBJECT_ rdisplay, USER_OBJECT_ plot); USER_OBJECT_ RS_GGOBI(getPlotScale)(USER_OBJECT_ rdisplay, USER_OBJECT_ plot); #endif rggobi/src/RSEval.c0000644000175100001440000000245012761555755013653 0ustar hornikusers/* Contains routines for invoking R/S functions and evaluating expressions. */ #include "RSGGobi.h" #include "RSEval.h" USER_OBJECT_ RS_GGOBI(callFunction)(USER_OBJECT_ fn, USER_OBJECT_ argList) { SEXP e, ans; e = allocVector(LANGSXP, 2); SETCAR(e, fn); SETCAR(CDR(e), argList); PROTECT(e); ans = eval(e, R_GlobalEnv); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(callUserFunction)(const char *name, USER_OBJECT_ args) { USER_OBJECT_ ans, funcName, fn; PROTECT(args); funcName = install((char*) name); fn = findVar(funcName, R_GlobalEnv); if(!isFunction(fn)) { return(R_UnboundValue); } ans = RS_GGOBI(callFunction)(fn, args); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(callFunctionWithArgs)(USER_OBJECT_ fn, USER_OBJECT_ argList) { SEXP e, ans, tmp; int numArgs, i; numArgs = GET_LENGTH(argList); PROTECT(e = allocVector(LANGSXP, numArgs+1)); SETCAR(e, fn); tmp = e; for(i = 0; i < numArgs; i++) { SETCAR(CDR(tmp), VECTOR_ELT(argList, i)); tmp = CDR(tmp); } ans = eval(e, R_GlobalEnv); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(findFunction)(const char *name) { SEXP funcName = install((char*) name); SEXP fn = findVar(funcName, R_GlobalEnv); if(!isFunction(fn)) { return(R_UnboundValue); } return(fn); } rggobi/src/conversion.h0000644000175100001440000001072712761555755014717 0ustar hornikusers#ifndef CONVERSION_H #define CONVERSION_H #include "RSGGobi.h" typedef void* (*ElementConverter)(void *element); /***** ARRAY CONVERSION MACROS ******/ /* converts an array, taking the reference of each element, so that conversion functions taking a pointer parameter will work (array elements are values) */ #define asRArrayRef(array, converter) \ __extension__ \ ({ \ asRArray(&array, converter); \ }) #define asRArrayRefWithSize(array, converter, n) \ __extension__ \ ({ \ asRArrayWithSize(&array, converter, n); \ }) /* converts an array directly using the conversion function to an R list */ #define asRArray(array, converter) \ __extension__ \ ({ \ _asRArray(array, converter, LIST, VECTOR); \ }) #define asRArrayWithSize(array, converter, n) \ __extension__ \ ({ \ _asRArrayWithSize(array, converter, n, LIST, VECTOR); \ }) /* converts primitive (numeric, integer, logical) arrays to R vectors */ #define _asRPrimArray(array, TYPE) \ __extension__ \ ({ \ int n = 0; \ if (!array) \ NULL; \ while(array[n++]); \ _asRPrimArrayWithSize(array, n-1, TYPE); \ }) #define _asRPrimArrayWithSize(array, n, TYPE) \ __extension__ \ ({ \ int i; \ USER_OBJECT_ s_obj; \ PROTECT(s_obj = NEW_ ## TYPE(n)); \ \ for (i = 0; i < n; i++) { \ TYPE ## _POINTER(s_obj)[i] = array[i]; \ } \ \ UNPROTECT(1); \ s_obj; \ }) /* core converter, for converting string arrays and other arrays of pointer types */ #define _asRArray(array, converter, TYPE, SETTER_TYPE) \ __extension__ \ ({ \ int n = 0; \ if (!array) \ NULL; \ while(array[n++]); \ _asRArrayWithSize(array, converter, n-1, TYPE, SETTER_TYPE); \ }) #define _asRArrayWithSize(array, converter, n, TYPE, SETTER_TYPE) \ __extension__ \ ({ \ int i; \ USER_OBJECT_ s_obj; \ PROTECT(s_obj = NEW_ ## TYPE(n)); \ \ for (i = 0; i < n; i++) { \ SET_ ## SETTER_TYPE ## _ELT(s_obj, i, converter(array[i])); \ } \ \ UNPROTECT(1); \ s_obj; \ }) /* Below are primitive array -> R vector converters */ #define asRStringArray(array) \ __extension__ \ ({ \ _asRArray(array, COPY_TO_USER_STRING, CHARACTER, STRING); \ }) #define asRStringArrayWithSize(array, n) \ __extension__ \ ({ \ _asRArrayWithSize(array, COPY_TO_USER_STRING, n, CHARACTER, STRING); \ }) #define asRIntegerArray(array) \ __extension__ \ ({ \ _asRPrimArray(array, INTEGER); \ }) #define asRIntegerArrayWithSize(array, size) \ __extension__ \ ({ \ _asRPrimArrayWithSize(array, size, INTEGER); \ }) #define RAW_POINTER(x) RAW(x) #define asRRawArray(array) \ __extension__ \ ({ \ _asRPrimArray(array, RAW); \ }) #define asRRawArrayWithSize(array, size) \ __extension__ \ ({ \ _asRPrimArrayWithSize(array, size, RAW); \ }) #define asRNumericArray(array) \ __extension__ \ ({ \ _asRPrimArray(array, NUMERIC); \ }) #define asRNumericArrayWithSize(array, size) \ __extension__ \ ({ \ _asRPrimArrayWithSize(array, size, NUMERIC); \ }) #define asRLogicalArray(array) \ __extension__ \ ({ \ _asRPrimArray(array, LOGICAL); \ }) #define asRLogicalArrayWithSize(array, size) \ __extension__ \ ({ \ _asRPrimArrayWithSize(array, size, LOGICAL); \ }) /* now from R to C */ #define asCArrayRef(s, type, converter) \ __extension__ \ ({ \ asCArray(s, type, * converter); \ }) #define asCArray(s_array, type, converter) \ __extension__ \ ({ \ int i; \ \ type* array = (type*)R_alloc(GET_LENGTH(s_array), sizeof(type)); \ \ for (i = 0; i < GET_LENGTH(s_array); i++) { \ array[i] = (type)converter(VECTOR_ELT(s_array, i)); \ } \ \ array; \ }) gboolean asCLogical(USER_OBJECT_ s_log); int asCInteger(USER_OBJECT_ s_int); guchar asCRaw(USER_OBJECT_ s_raw); double asCNumeric(USER_OBJECT_ s_num); const char * asCString(USER_OBJECT_ s_str); char asCCharacter(USER_OBJECT_ s_char); USER_OBJECT_ asRLogical(Rboolean); USER_OBJECT_ asRInteger(int); USER_OBJECT_ asRRaw(guchar); USER_OBJECT_ asRNumeric(double); USER_OBJECT_ asRCharacter(char c); USER_OBJECT_ asRString(const char *); char ** asCStringArray(USER_OBJECT_ svec); /* NULL TERMINATES */ void *getPtrValue(USER_OBJECT_); USER_OBJECT_ toRPointer(void*, const char *name); /* GGobi specific converters */ /* R to C */ ggobid *toGGobi(USER_OBJECT_ s_ggobi); GGobiData *toData(USER_OBJECT_ d); displayd *toDisplay(USER_OBJECT_ rdisplay); /* Wrapping GGobi objects as SEXP's */ USER_OBJECT_ RS_datasetInstance(GGobiData *d) ; USER_OBJECT_ RS_ggobiInstance(ggobid *gg); USER_OBJECT_ RS_displayInstance(displayd *display); #endif rggobi/src/RSEval.h0000644000175100001440000000057612761555755013667 0ustar hornikusers#ifndef RS_GGOBI_EVAL_H #define RS_GGOBI_EVAL_H #include "Rinternals.h" USER_OBJECT_ RS_GGOBI(callFunction)(USER_OBJECT_ fn, USER_OBJECT_ argList); USER_OBJECT_ RS_GGOBI(callUserFunction)(const char *name, USER_OBJECT_ args); USER_OBJECT_ RS_GGOBI(findFunction)(const char *funcName); USER_OBJECT_ RS_GGOBI(callFunctionWithArgs)(USER_OBJECT_ fn, USER_OBJECT_ argList); #endif rggobi/src/conversion.c0000644000175100001440000000746612761555755014720 0ustar hornikusers#include "conversion.h" #include char ** asCStringArray(USER_OBJECT_ svec) { char **els = NULL; int i, n; n = GET_LENGTH(svec); if(n > 0) { els = (char **) R_alloc(n+1, sizeof(char*)); for(i = 0; i < n; i++) { els[i] = (char *)CHAR_DEREF(STRING_ELT(svec, i)); } els[n] = NULL; } return(els); } gboolean asCLogical(USER_OBJECT_ s_log) { if (GET_LENGTH(s_log) == 0) return(FALSE); return(LOGICAL_DATA(s_log)[0]); } int asCInteger(USER_OBJECT_ s_int) { if (GET_LENGTH(s_int) == 0) return(0); return(INTEGER_DATA(s_int)[0]); } guchar asCRaw(USER_OBJECT_ s_raw) { if (GET_LENGTH(s_raw) == 0) return(0); return(RAW(s_raw)[0]); } double asCNumeric(USER_OBJECT_ s_num) { if (GET_LENGTH(s_num) == 0) return(0); return(NUMERIC_DATA(s_num)[0]); } /* This function takes a STRSXP or CHARSXP to a C string */ const char * asCString(USER_OBJECT_ s_str) { if (IS_VECTOR(s_str)) { if (GET_LENGTH(s_str) == 0) return(NULL); s_str = STRING_ELT(s_str, 0); } return(CHAR_DEREF(s_str)); /*return(CHAR_DEREF(STRING_ELT(s_str, 0)));*/ } char asCCharacter(USER_OBJECT_ s_char) { return(asCString(s_char)[0]); } USER_OBJECT_ asRLogical(Rboolean val) { USER_OBJECT_ ans; ans = NEW_LOGICAL(1); LOGICAL_DATA(ans)[0] = val; return(ans); } USER_OBJECT_ asRRaw(guchar val) { USER_OBJECT_ ans; ans = NEW_RAW(1); RAW(ans)[0] = val; return(ans); } USER_OBJECT_ asRInteger(int val) { USER_OBJECT_ ans; ans = NEW_INTEGER(1); INTEGER_DATA(ans)[0] = val; return(ans); } USER_OBJECT_ asRNumeric(double val) { USER_OBJECT_ ans; ans = NEW_NUMERIC(1); NUMERIC_DATA(ans)[0] = val; return(ans); } USER_OBJECT_ asRCharacter(char c) { char str[] = { c, '\0' }; return(asRString(str)); } USER_OBJECT_ asRString(const char *val) { USER_OBJECT_ ans; if (!val) return(NULL_USER_OBJECT); PROTECT(ans = NEW_CHARACTER(1)); if(val) SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(val)); UNPROTECT(1); return(ans); } void * getPtrValue(USER_OBJECT_ sval) { if(sval == NULL_USER_OBJECT) return(NULL); return(R_ExternalPtrAddr(sval)); } USER_OBJECT_ R_internal_getGTypeHierarchy(GType type) { USER_OBJECT_ ans; int n = 0; GType orig = type; while(type != 0 && type != G_TYPE_INVALID) { type = g_type_parent(type); n++; } PROTECT(ans = NEW_CHARACTER(n)); n = 0; type = orig; while(type != G_TYPE_INVALID) { const char *val; val = g_type_name(type); SET_STRING_ELT(ans, n, COPY_TO_USER_STRING(val)); n++; type = g_type_parent(type); } UNPROTECT(1); return(ans); } USER_OBJECT_ R_internal_getInterfaces(GType type) { SEXP list; GType *interfaces; guint n, i; interfaces = g_type_interfaces(type, &n); PROTECT(list = NEW_CHARACTER(n)); for(i = 0; i < n; i++) SET_STRING_ELT(list, i, COPY_TO_USER_STRING(g_type_name(interfaces[i]))); g_free(interfaces); UNPROTECT(1); return(list); } USER_OBJECT_ toRPointer(void *val, const char *typeName) { USER_OBJECT_ ans, klass = NULL; GType type = 0; if(val == NULL) return(NULL_USER_OBJECT); PROTECT(ans = R_MakeExternalPtr(val, Rf_install(typeName), NULL_USER_OBJECT)); if (typeName) type = g_type_from_name(typeName); if(type) { if (G_TYPE_IS_INSTANTIATABLE(type) || G_TYPE_IS_INTERFACE(type)) type = G_TYPE_FROM_INSTANCE(val); if (G_TYPE_IS_DERIVED(type)) { setAttrib(ans, install("interfaces"), R_internal_getInterfaces(type)); PROTECT(klass = R_internal_getGTypeHierarchy(type)); } } if (!klass && typeName) { PROTECT(klass = asRString(typeName)); } if(klass) { SET_CLASS(ans, klass); UNPROTECT(1); } UNPROTECT(1); return(ans); } rggobi/src/RSCommon.h0000644000175100001440000000601512761555755014222 0ustar hornikusers #ifndef RSCOMMON_H #define RSCOMMON_H #ifdef __cplusplus extern "C" { #endif #if defined(_S_) /* || defined(_R_) */ #ifdef _SPLUS5_ #ifdef ARGS #undef ARGS #endif #endif #include "S.h" #ifdef _SPLUS5_ #include "S_tokens.h" typedef boolean s_boolean; #endif /* End of _SPLUS5_ */ #endif #if defined(_S4_) #define vector s_object typedef s_object* USER_OBJECT_; typedef long RSInt; typedef s_boolean Rboolean; #endif #if defined _SPLUS6_ typedef s_boolean boolean; #define TRUE S_TRUE #define FALSE S_FALSE #endif #if defined(_R_) #include #include #ifdef length #undef length #endif #ifdef GET_LENGTH #undef GET_LENGTH #define GET_LENGTH(x) Rf_length(x) #endif #ifdef append #undef append #endif typedef SEXP USER_OBJECT_; typedef int RSInt; #include "Rversion.h" #if R_VERSION < R_Version(1, 2, 0) #define STRING_ELT(x,i) STRING(x)[i] #define VECTOR_ELT(x,i) VECTOR(x)[i] #define SET_STRING_ELT(x,i,v) (STRING(x)[i]=(v)) #define SET_VECTOR_ELT(x,i,v) (VECTOR(x)[i]=(v)) #define SETCAR(x,v) (CAR(x) = v) #else typedef Rboolean boolean; #endif #endif #if defined(_S4_) /* redefine vector and declare routines with S_evaluator */ #ifdef vector #undef vector #endif #define COPY_TO_USER_STRING(a) c_s_cpy(a, S_evaluator) #define LOCAL_EVALUATOR S_EVALUATOR #define CREATE_FUNCTION_CALL(name, argList) alcf(name, argList, S_evaluator) #define CREATE_STRING_VECTOR(a) STRING_VECTOR(a, S_evaluator) #define NULL_USER_OBJECT S_void /* This is to keep R happy until it moves to char ** rather than SEXP * for character vectors. */ #define CHAR_DEREF(x) (x) #ifdef PROTECT #undef PROTECT #endif #define PROTECT(x) (x) /**/ #define UNPROTECT(x) /**/ /* Note that this will override the one in S.h which is for S4, not S3, style classes. */ #if defined(SET_CLASS) #undef SET_CLASS #endif #define SET_CLASS(obj,classname) set_attr((obj), "class", (classname), S_evaluator) #if defined(GET_CLASS) #undef GET_CLASS #endif #define GET_CLASS(x) GET_ATTR((x), "class") #define STRING_ELT(x,i) CHARACTER_DATA(x)[i] #define VECTOR_ELT(x,i) LIST_POINTER(x)[i] #define SET_VECTOR_ELT(v, pos, val) LIST_POINTER((v))[(pos)]=(val) #define SET_STRING_ELT(v, pos, val) CHARACTER_DATA((v))[(pos)]=(val) #endif /* end of this S4 */ #if defined(_R_) #define CHAR_DEREF(x) CHAR((x)) /* SET_CLASS and SET_NAMES have been moved to Rdefines.h in the R distribution.*/ #endif /* of defined(_R_) */ #if defined(_Octave_) #include extern char error_buf[]; #define PROBLEM sprintf(error_buf, #define ERROR ); error(error_buf) #define STRING_VALUE(a) a.all_strings()[0].c_str() #define GET_LENGTH(a) getLength(a) #define LOCAL_EVALUATOR /**/ #define COPY_TO_USER_STRING(a) strdup(a) /*XXX*/ #endif /* end of defined(_Octave_)*/ #ifdef __cplusplus } #endif #endif /* end of RSCOMMON_H*/ rggobi/src/keyHandlers.c0000644000175100001440000000556612761555755015003 0ustar hornikusers#include "RSGGobi.h" #include #include #include "RSEval.h" /* Takes care of registering, unregistering and invoking handlers for key press events from ggobi for the numbered keys (i.e. 0, ..., 9) */ gboolean RS_GGOBI(GenericKeyPressHandler)(guint keyval, GtkWidget *w, GdkEventKey *event, cpaneld *cpanel, splotd *sp, ggobid *gg, void *userData); USER_OBJECT_ RS_INTERNAL_GGOBI(createRSGdkEvent)(GdkEventKey *event); USER_OBJECT_ RS_GGOBI(setNumberedKeyHandler)(USER_OBJECT_ handler, USER_OBJECT_ sdescription, USER_OBJECT_ ggobiId) { extern void R_PreserveObject(USER_OBJECT_); ggobid *gg = toGGobi(ggobiId); USER_OBJECT_ ans = NULL_USER_OBJECT; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(GET_LENGTH(handler)) { const char *description = CHAR_DEREF(STRING_ELT(sdescription, 0)); R_PreserveObject(handler); GGOBI(registerNumberedKeyEventHandler)(RS_GGOBI(GenericKeyPressHandler), handler, (char *)description, NULL, gg, R); } else { KeyEventHandler *old = GGOBI(removeNumberedKeyEventHandler)(gg); g_free(old->description); g_free(old); } return(ans); } #define NUM_HANDLER_ARGS 4 /* The invocation handler function within the handler object must be last. */ gboolean RS_GGOBI(GenericKeyPressHandler)(guint keyval, GtkWidget *w, GdkEventKey *event, cpaneld *cpanel, splotd *sp, ggobid *gg, void *userData) { USER_OBJECT_ myHandler; USER_OBJECT_ skey, argList, fun; myHandler = (USER_OBJECT_) userData; PROTECT(argList = NEW_LIST(NUM_HANDLER_ARGS)); SET_VECTOR_ELT(argList, 0, skey = NEW_INTEGER(1)); INTEGER_DATA(skey)[0] = keyval - GDK_0; SET_VECTOR_ELT(argList, 2, RS_ggobiInstance(gg)); SET_VECTOR_ELT(argList, 3, toRPointer(event, "GdkEventKey")); fun = VECTOR_ELT(myHandler, GET_LENGTH(myHandler)-1); RS_GGOBI(callFunctionWithArgs)(fun, argList); UNPROTECT(1); return(true); } /* USER_OBJECT_ RS_INTERNAL_GGOBI(createRSGdkEvent)(GdkEventKey *event) { USER_OBJECT_ ans, klassName; PROTECT(ans = NEW_NUMERIC(1)); NUMERIC_DATA(ans)[0] = (double) (long) event; PROTECT(klassName = NEW_CHARACTER(1)); SET_STRING_ELT(klassName, 0, COPY_TO_USER_STRING("GdkEventKey")); SET_CLASS(ans, klassName); UNPROTECT(2); return(ans); } */ USER_OBJECT_ RS_GGOBI(getNumberedKeyHandler)(USER_OBJECT_ ggobiId) { USER_OBJECT_ ans = NULL_USER_OBJECT; ggobid *gg = toGGobi(ggobiId); KeyEventHandler *h; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg == NULL) { PROBLEM "Error in accessing a ggobi instance" ERROR; } h = gg->NumberedKeyEventHandler; if(h == NULL) return(ans); if(h->language == R) { ans = (USER_OBJECT_) h->userData; } else { PROBLEM "The register key handler is not an R handler. Cannot currently handle this!" ERROR; } return(ans); } rggobi/src/plugins.c0000644000175100001440000000332212761555755014177 0ustar hornikusers#include "RSGGobi.h" #if 0 #include "plugin.h" USER_OBJECT_ RS_GGOBI(getPlugins)(USER_OBJECT_ gobiId) { ggobid *gg = toGGobi(gobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); USER_OBJECT_ ans, names; GList *tmp; gint n, i; n = g_list_length(gg->pluginInstances); PROTECT(ans = NEW_LIST(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0, tmp = gg->pluginInstances; i < n; tmp=tmp->next, i++) { PluginInstance *inst = tmp->data; SET_VECTOR_ELT(ans, i, toRPointer(tmp->data, "GGobiPluginInstance")); SET_STRING_ELT(names, i, COPY_TO_USER_STRING(inst->info->details->name)); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } static USER_OBJECT_ R_getPluginInfo(GGobiPluginInfo *info) { SEXP klass = MAKE_CLASS("GGobiPluginInfo"); USER_OBJECT_ ans; PROTECT(ans = NEW(klass)); SET_SLOT(ans, Rf_install("dll"), mkString(info->details->dllName)); SET_SLOT(ans, Rf_install("name"), mkString(info->details->name)); SET_SLOT(ans, Rf_install("description"), mkString(info->details->description)); SET_SLOT(ans, Rf_install("author"), mkString(info->details->author)); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getPluginInfo)(USER_OBJECT_ gobiId) { USER_OBJECT_ ans, names; GList *tmp, *plugins; gint n, i; plugins = GGOBI_getSessionOptions()->info->plugins; n = g_list_length(plugins); PROTECT(ans = NEW_LIST(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0, tmp = plugins; i < n; tmp=tmp->next, i++) { GGobiPluginInfo *inst = tmp->data; SET_VECTOR_ELT(ans, i, R_getPluginInfo(inst)); SET_STRING_ELT(names, i, COPY_TO_USER_STRING(inst->details->name)); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } #endif rggobi/src/Makevars.win.in0000644000175100001440000000016712325763563015245 0ustar hornikusersPKG_CFLAGS=-mms-bitfields PKG_CPPFLAGS=-DUSE_EXT_PTR=1 -D_R_=1 -I../inst/include @GGOBI_CFLAGS@ PKG_LIBS=@GGOBI_LIBS@ rggobi/src/utils.c0000644000175100001440000000253112761555755013657 0ustar hornikusers#include "RUtils.h" #include "RSGGobi.h" #include "vars.h" int R_IS(USER_OBJECT_ obj, const char * const name) { int i, n; USER_OBJECT_ className; className = getAttrib(obj, R_ClassSymbol); n = GET_LENGTH(className); for(i=0;inlevels)); PROTECT(labels = NEW_CHARACTER(vt->nlevels)); for(i = 0; i < vt->nlevels; i++) { INTEGER_DATA(levels)[i] = vt->level_values[i]; if (vt->level_names[i]) SET_STRING_ELT(labels, i, COPY_TO_USER_STRING(vt->level_names[i])); } PROTECT(e = allocVector(LANGSXP, 4)); SETCAR(e, Rf_install("factor")); SETCAR(CDR(e), vals); SETCAR(CDR(CDR(e)), levels); SETCAR(CDR(CDR(CDR(e))), labels); ans = eval(e, R_GlobalEnv); UNPROTECT(3); return(ans); } rggobi/src/colorSchemes.c0000644000175100001440000002515212761555755015151 0ustar hornikusers#include "RSGGobi.h" #include /* For the R_IsNaN() routine. */ /** This gets and sets the colorschemes in a GGobi instance or the session options. */ USER_OBJECT_ RSGGobi_Internal_getColorSchemes(GList *schemes); USER_OBJECT_ RSGGobi_Internal_getColorScheme(colorschemed *scheme); USER_OBJECT_ RSGGobi_Internal_getColor(gfloat *vals, colorscaletype type, int n); colorschemed *RS_createGGobiScheme(USER_OBJECT_ scheme, USER_OBJECT_ name); gfloat *RS_setGGobiColor(USER_OBJECT_ colors); static GList * RSGGobi_Internal_getSchemeFromGGobi(USER_OBJECT_ gobiId) { GList *schemes = NULL; if(GET_LENGTH(gobiId)) { ggobid *gg; gg = toGGobi(gobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL); schemes = gg->colorSchemes; } else if(sessionOptions) { schemes = sessionOptions->colorSchemes; } else { g_critical("GGobi has not been initialized yet. Please create an instance!"); } return(schemes); } USER_OBJECT_ RS_GGOBI(getColorSchemes)(USER_OBJECT_ gobiId) { GList *schemes; schemes = RSGGobi_Internal_getSchemeFromGGobi(gobiId); return(RSGGobi_Internal_getColorSchemes(schemes)); } USER_OBJECT_ RSGGobi_Internal_getColorSchemes(GList *schemes) { int i, n; USER_OBJECT_ ans, names; colorschemed *s; n = g_list_length(schemes); PROTECT(ans = NEW_LIST(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n ; i++) { s = (colorschemed *) g_list_nth_data(schemes, i); SET_STRING_ELT(names, i, COPY_TO_USER_STRING(s->name)); SET_VECTOR_ELT(ans, i, RSGGobi_Internal_getColorScheme(s)); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } enum { CS_COLORS, CS_BACKGROUND, CS_ANNOTATIONS, CS_CRITICAL_VALUE, CS_DESCRIPTION, CS_TYPE, CS_SYSTEM, CS_NAME, CS_NUM_SLOTS }; static gchar *cs_names[] = { "colors", "background", "annotations", "criticalvalue", "description", "type", "system", "name" }; USER_OBJECT_ RSGGobi_Internal_getColorScheme(colorschemed *scheme) { USER_OBJECT_ ans, tmp, names; int i, n; PROTECT(ans = NEW_LIST(CS_NUM_SLOTS)); n = scheme->n; PROTECT(names = NEW_CHARACTER(n)); PROTECT(tmp = NEW_LIST(n)); for(i = 0; i < n; i++) { SET_VECTOR_ELT(tmp, i, RSGGobi_Internal_getColor(scheme->data[i], scheme->type, 3)); SET_STRING_ELT(names, i, COPY_TO_USER_STRING(g_array_index(scheme->colorNames, gchar *, i))); } SET_NAMES(tmp, names); SET_VECTOR_ELT(ans, CS_COLORS, tmp); UNPROTECT(2); SET_VECTOR_ELT(ans, CS_BACKGROUND, RSGGobi_Internal_getColor(scheme->bg, scheme->type, 3)); SET_VECTOR_ELT(ans, CS_ANNOTATIONS, RSGGobi_Internal_getColor(scheme->accent, scheme->type, 3)); PROTECT(tmp = NEW_INTEGER(1)); INTEGER_DATA(tmp)[0] = scheme->criticalvalue; SET_VECTOR_ELT(ans, CS_CRITICAL_VALUE, tmp); UNPROTECT(1); PROTECT(tmp = NEW_CHARACTER(1)); if(scheme->description) SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(scheme->description)); SET_VECTOR_ELT(ans, CS_DESCRIPTION, tmp); UNPROTECT(1); PROTECT(names = NEW_CHARACTER(1)); PROTECT(tmp = NEW_INTEGER(1)); { char *schemeName = ""; switch(scheme->type) { case rgb: schemeName = "diverging"; break; case hsv: schemeName = "sequential"; break; case cmy: schemeName = "spectral"; break; case cmyk: schemeName = "qualitative"; break; default: break; } SET_STRING_ELT(names, 0, COPY_TO_USER_STRING(schemeName)); } INTEGER_DATA(tmp)[0] = scheme->type; SET_NAMES(tmp, names); SET_VECTOR_ELT(ans, CS_TYPE, tmp); UNPROTECT(2); PROTECT(names = NEW_CHARACTER(1)); PROTECT(tmp = NEW_INTEGER(1)); { char *schemeName = ""; switch(scheme->system) { case rgb: schemeName = "rgb"; break; case hsv: schemeName = "hsv"; break; case cmy: schemeName = "cmy"; break; case cmyk: schemeName = "cmyk"; break; default: break; } SET_STRING_ELT(names, 0, COPY_TO_USER_STRING(schemeName)); } INTEGER_DATA(tmp)[0] = scheme->system; SET_NAMES(tmp, names); SET_VECTOR_ELT(ans, CS_SYSTEM, tmp); UNPROTECT(2); PROTECT(tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(scheme->name)); SET_VECTOR_ELT(ans, CS_NAME, tmp); UNPROTECT(1); SET_NAMES(ans, asRStringArrayWithSize(cs_names, CS_NUM_SLOTS)); UNPROTECT(1); return(ans); } USER_OBJECT_ RSGGobi_Internal_getColor(gfloat *vals, colorscaletype type, int n) { USER_OBJECT_ ans; int i; ans = NEW_NUMERIC(n); for(i = 0; i < n; i++) { NUMERIC_DATA(ans)[i] = vals ? vals[i] : NA_REAL; } return(ans); } USER_OBJECT_ RS_GGOBI(addColorScheme)(USER_OBJECT_ sscheme, USER_OBJECT_ name, USER_OBJECT_ overwrite, USER_OBJECT_ gobiId) { USER_OBJECT_ ans; int index = 0; colorschemed *scheme; GList *schemes = RSGGobi_Internal_getSchemeFromGGobi(gobiId); scheme = RS_createGGobiScheme(sscheme, name); /* Perhaps we need to inform the Color scheme tool if it is open, and add it to the tree. Similarly, if we set the active scheme from R, we should tell everybody that might be interested. */ if(LOGICAL_DATA(overwrite)[0]) { /* */ /* g_list_find_custom(); */ } else { schemes = g_list_append(schemes, scheme); index = g_list_length(schemes); } ans = NEW_INTEGER(1); INTEGER_DATA(ans)[0] = index; return(ans); } colorschemed * RS_createGGobiScheme(USER_OBJECT_ sscheme, USER_OBJECT_ name) { colorschemed *scheme; int n, i; USER_OBJECT_ colorNames; const char *str; gchar *gstr; SEXP colors; gfloat *tmp; scheme = alloc_colorscheme(sizeof(colorschemed)); if(!scheme) { PROBLEM "Cannot allocate space for color scheme" ERROR; } scheme->type = INTEGER_DATA(GET_SLOT(sscheme, Rf_install("type")))[0]; scheme->system = INTEGER_DATA(GET_SLOT(sscheme, Rf_install("system")))[0]; scheme->criticalvalue = INTEGER_DATA(GET_SLOT(sscheme, Rf_install("criticalvalue")))[0]; scheme->name = g_strdup(CHAR_DEREF(STRING_ELT(name, 0))); scheme->description = g_strdup(CHAR_DEREF(STRING_ELT(GET_SLOT(sscheme, Rf_install("description")), 0))); colors = GET_SLOT(sscheme, Rf_install("colors")); scheme->n = n = GET_LENGTH(colors); colorNames = GET_NAMES(colors); scheme->data = (gfloat **) g_malloc(sizeof(gfloat *) * n); for(i = 0; i < n; i++) { if(GET_LENGTH(colorNames) && (str = CHAR_DEREF(STRING_ELT(colorNames, i)))) { gstr = g_strdup(str); g_array_append_val(scheme->colorNames, gstr); } scheme->data[i] = RS_setGGobiColor(VECTOR_ELT(colors, i)); } tmp = RS_setGGobiColor(GET_SLOT(sscheme, Rf_install("background"))); if(tmp) scheme->bg = tmp; tmp = RS_setGGobiColor(GET_SLOT(sscheme, Rf_install("annotations"))); if(tmp) scheme->accent = tmp; return(scheme); } gfloat * RS_setGGobiColor(USER_OBJECT_ colors) { int j, numVals; gfloat *data; colors = GET_SLOT(colors, Rf_install(".Data")); numVals = GET_LENGTH(colors); data = g_malloc(sizeof(gfloat) * numVals); for(j = 0; j < numVals ; j++) { double val; val = NUMERIC_DATA(colors)[j]; if(R_IsNaN(val)) { g_free(data); return(NULL); } data[j] = val; } return(data); } static int schemeNameCompare(gconstpointer scheme, gconstpointer data) { return(strcmp(((colorschemed *)scheme)->name, (char *)data)); } USER_OBJECT_ RS_GGOBI(getActiveColorScheme)(USER_OBJECT_ gobiId) { USER_OBJECT_ ans = NULL_USER_OBJECT; colorschemed *scheme = NULL; /*PROTECT(ans = NEW_CHARACTER(1)); SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(sessionOptions->activeColorScheme)); UNPROTECT(1); return(ans); */ if(GET_LENGTH(gobiId) == 0) { scheme = findColorSchemeByName(sessionOptions->colorSchemes, sessionOptions->activeColorScheme); } else { ggobid *gg = toGGobi(gobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); scheme = gg->activeColorScheme; } if(scheme) ans = RSGGobi_Internal_getColorScheme(scheme); return(ans); } USER_OBJECT_ RS_GGOBI(setActiveColorScheme)(USER_OBJECT_ id, USER_OBJECT_ gobiId) { USER_OBJECT_ ans; char *tmp = NULL; GList *schemes; ggobid *gg = NULL; colorschemed *newScheme = NULL; if(GET_LENGTH(gobiId) == 0) { if(sessionOptions) { tmp = sessionOptions->activeColorScheme; if(IS_INTEGER(id)) { if(sessionOptions->colorSchemes) { newScheme = g_list_nth_data(sessionOptions->colorSchemes, INTEGER_DATA(id)[0]); if(newScheme) sessionOptions->activeColorScheme = g_strdup(newScheme->name); else { PROBLEM "No such color scheme available in the session options." ERROR; } } else { PROBLEM "No color schemes available in the session options." ERROR; } } else if(IS_CHARACTER(id)) { sessionOptions->activeColorScheme = g_strdup(CHAR_DEREF(STRING_ELT(id, 0))); if(sessionOptions->colorSchemes) newScheme = findColorSchemeByName(sessionOptions->colorSchemes, sessionOptions->activeColorScheme); if(!newScheme) { PROBLEM "Setting default color scheme name in session options, but there is no such color scheme available." WARN; } } } else { PROBLEM "GGobi has not been initialized yet. Please initialize the engine (init.ggobi()) or create an instance (ggobi())!" ERROR; } } else { GList *scheme_el = NULL; gg = toGGobi(gobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); schemes = RSGGobi_Internal_getSchemeFromGGobi(gobiId); if(!schemes) { PROBLEM "Cannot get color schemes list" ERROR; } if(gg->activeColorScheme) tmp = gg->activeColorScheme->name; if(IS_INTEGER(id)) scheme_el = g_list_nth(schemes, INTEGER_DATA(id)[0]); else if(IS_CHARACTER(id)) scheme_el = g_list_find_custom(schemes, CHAR_DEREF(STRING_ELT(id, 0)), schemeNameCompare); if (scheme_el) newScheme = scheme_el->data; if(newScheme) { GGobiData *d = (GGobiData *) g_slist_nth_data(gg->d, 0); gg->activeColorScheme = newScheme; colorscheme_init(newScheme); displays_plot (NULL, FULL, gg); symbol_window_redraw (gg); cluster_table_update (d, gg); gdk_flush(); } } if(tmp) { PROTECT(ans = NEW_CHARACTER(1)); SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(gg->activeColorScheme->name)); UNPROTECT(1); } else ans = NULL_USER_OBJECT; return(ans); } rggobi/src/RUtils.h0000644000175100001440000000035412761555755013747 0ustar hornikusers#ifndef RUTILS_H #define RUTILS_H #include "RSGGobi.h" int R_IS(USER_OBJECT_ obj, const char * const name); void RS_throwError(char *msg); USER_OBJECT_ createFactor(USER_OBJECT_ vals, vartabled *vt, GGobiData *d, int which); #endif rggobi/src/ui.c0000644000175100001440000000406212761555755013135 0ustar hornikusers#include "RSGGobi.h" /** This returns a raw pointer to the Gtk window object associated with the given display, which is given as an S object of class GGobiDisplay. */ USER_OBJECT_ RS_GGOBI(getDisplayWindow)(USER_OBJECT_ display) { displayd *dpy; dpy = (displayd*) R_ExternalPtrAddr((VECTOR_ELT(display, 1))); if(!dpy || GGOBI_IS_WINDOW_DISPLAY(dpy) == false) return(NULL_USER_OBJECT); return(toRPointer(GGOBI_WINDOW_DISPLAY(dpy)->window, "GtkWindow")); } /** Extracts a list of the splotd objects from the given displayd given as an S object of class GGobiDisplay. This returns the splotd objects as simple external pointers and does not put a class on them. */ USER_OBJECT_ RS_GGOBI(getDisplayPlotWidgets)(USER_OBJECT_ display) { displayd *dpy; int n; GList *tmp; USER_OBJECT_ els; #if 1 dpy = R_ExternalPtrAddr(VECTOR_ELT(display, 1)); #else dpy = (displayd*) (long) NUMERIC_DATA(VECTOR_ELT(display, 1))[0]; #endif n = g_list_length(dpy->splots); PROTECT(els = NEW_LIST(n)); tmp = dpy->splots; n = 0; while(tmp) { USER_OBJECT_ p; splotd *sp = (splotd *) tmp->data; p = toRPointer(sp->da, "GtkWidget"); SET_VECTOR_ELT(els, n++, p); tmp = tmp->next; } UNPROTECT(1); return(els); } USER_OBJECT_ RS_GGOBI(getMainMenubar)(USER_OBJECT_ gobi) { ggobid *gg = toGGobi(gobi); USER_OBJECT_ ans = NULL_USER_OBJECT; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) ans = toRPointer(gg->main_menubar, "GtkWidget"); return(ans); } USER_OBJECT_ RS_GGOBI(getDisplayMenubar)(USER_OBJECT_ display, USER_OBJECT_ gobiId) { displayd *dpy = toDisplay(display); USER_OBJECT_ ans = NULL_USER_OBJECT; g_return_val_if_fail(GGOBI_IS_DISPLAY(dpy), NULL_USER_OBJECT); ans = toRPointer(dpy->menubar, "GtkWidget"); return(ans); } USER_OBJECT_ RS_GGOBI(getMainWindow)(USER_OBJECT_ gobiId) { ggobid *gg = toGGobi(gobiId); USER_OBJECT_ ans; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); ans = toRPointer(gg->main_window, "GtkWindow"); return(ans); } rggobi/src/session.c0000644000175100001440000000354212761555755014205 0ustar hornikusers#include "RSGGobi.h" /* R & S routines for querying the system values such as glyphs, color names, etc. in the X/GGobi session. */ USER_OBJECT_ RS_GGOBI(getGlyphTypes)() { USER_OBJECT_ ans, names; int n = -1, i; gint *gtypes; const gchar * const *gnames; gtypes = GGOBI(getGlyphTypes)(&n); gnames = GGOBI(getGlyphTypeNames)(&n); PROTECT(ans = NEW_INTEGER(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n; i++) { INTEGER_DATA(ans)[i] = gtypes[i]; SET_STRING_ELT(names, i, COPY_TO_USER_STRING(gnames[i])); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(getGlyphSizes)() { int i; USER_OBJECT_ ans; PROTECT(ans = NEW_INTEGER(NGLYPHSIZES+1)); for(i = 0; i <= NGLYPHSIZES; i++) INTEGER_DATA(ans)[i] = i; UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getVersionInfo)() { USER_OBJECT_ ans, tmp; const int *versionNumbers; int i; PROTECT(ans = NEW_LIST(3)); SET_VECTOR_ELT(ans, 0, tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(GGOBI(getVersionDate)())); SET_VECTOR_ELT(ans, 2, tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(GGOBI(getVersionString)())); SET_VECTOR_ELT(ans, 1, tmp = NEW_INTEGER(3)); versionNumbers = GGOBI(getVersionNumbers)(); for(i = 0; i < 3; i++) { INTEGER_DATA(tmp)[i] = versionNumbers[i]; } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getDataModes)() { USER_OBJECT_ ans, names; const gchar * const *modeNames; int n, i; modeNames = GGOBI(getDataModeNames)(&n); PROTECT(ans = NEW_INTEGER(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n; i++) { INTEGER_DATA(ans)[i] = i; SET_STRING_ELT(names, i, COPY_TO_USER_STRING(modeNames[i])); } if(modeNames) g_free((gchar *)modeNames); SET_NAMES(ans, names); UNPROTECT(2); return(ans); } rggobi/src/identify.c0000644000175100001440000000315012761555755014330 0ustar hornikusers#include "RSGGobi.h" #include #include "vars.h" #include "R.h" #include "Rinternals.h" #include "RSEval.h" /* IdentifyProc RS_INTERNAL_GGOBI(identifyHandler); */ void RS_INTERNAL_GGOBI(identifyHandler)(void *user_data, gint k, splotd *sp, GtkWidget *w, ggobid *gg); USER_OBJECT_ RS_GGOBI(setIdentifyHandler)(USER_OBJECT_ func, USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); USER_OBJECT_ ans = NULL_USER_OBJECT; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg == NULL) { PROBLEM "Invalid ggobi identifier specified." ERROR; } #ifdef EXPLICIT_IDENTIFY_HANDLER if(gg->identify_handler.handler == &RS_INTERNAL_GGOBI(identifyHandler)) { ans = (USER_OBJECT_) gg->identify_handler.user_data; R_ReleaseObject(ans); } if(GET_LENGTH(func)) { /* Make certain it knows to call us. */ R_PreserveObject(func); GGOBI(setIdentifyHandler)(RS_INTERNAL_GGOBI(identifyHandler), func, gg); } else { GGOBI(setIdentifyHandler)(NULL, NULL, gg); } #endif return(ans); } /* This should pass the following values to the function: 1) the observation index 2) the plot index 3) display 4) the dataset. */ void RS_INTERNAL_GGOBI(identifyHandler)(void *user_data, gint k, splotd *sp, GtkWidget *w, ggobid *gg) { USER_OBJECT_ func = (USER_OBJECT_) user_data; USER_OBJECT_ e; USER_OBJECT_ tmp; PROTECT(e = allocVector(LANGSXP, 3)); SETCAR(e, func); SETCAR(CDR(e), tmp = NEW_INTEGER(1)); INTEGER_DATA(tmp)[0] = k; SETCAR(CDR(CDR(e)), RS_displayInstance(sp->displayptr)); eval(e, R_GlobalEnv); UNPROTECT(1); } rggobi/src/displays.c0000644000175100001440000000716412761555755014356 0ustar hornikusers#include "RSGGobi.h" #include USER_OBJECT_ RS_GGOBI(getNumDisplays)(USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); int len; USER_OBJECT_ ans = NEW_INTEGER(1); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { len = g_list_length(gg->displays); INTEGER_DATA(ans)[0] = len; } return(ans); } /* how about getting the current display and then getting its type? */ USER_OBJECT_ RS_GGOBI(getCurrentDisplayType)(USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); USER_OBJECT_ ans; const gchar *name = GGOBI(getCurrentDisplayType)(gg); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); PROTECT(ans = NEW_CHARACTER(1)); SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(name)); UNPROTECT(1); return(ans); } /** queries ggobi's list of display types, assuming GGobi has been initialized. */ USER_OBJECT_ RS_GGOBI(getDisplayTypes)() { GSList *l; gint n; USER_OBJECT_ ans, names; l = GGOBI(getExtendedDisplayTypes)(); n = g_slist_length(l); PROTECT(ans = NEW_LIST(n)); PROTECT(names = NEW_CHARACTER(n)); n = 0; for( ; l ; l = l->next, n++) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_CLASS((GtkObjectClass*) l->data); SET_STRING_ELT(names, n, COPY_TO_USER_STRING(klass->titleLabel)); SET_VECTOR_ELT(ans, n, asRString(g_type_name(G_OBJECT_CLASS_TYPE(klass)))); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(raiseOrLowerDisplays)(USER_OBJECT_ displays, USER_OBJECT_ iconify, USER_OBJECT_ raise, USER_OBJECT_ ggobiId) { USER_OBJECT_ ans; int numDisplays = GET_LENGTH(displays), i; if(numDisplays == 0) return(NULL_USER_OBJECT); PROTECT(ans = NEW_LOGICAL(numDisplays)); for(i = 0; i < numDisplays; i++) { displayd *display; windowDisplayd *wdpy; display = toDisplay(VECTOR_ELT(displays, i)); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); wdpy = GGOBI_WINDOW_DISPLAY(display); if(LOGICAL_DATA(iconify)[0] == FALSE) { if(LOGICAL_DATA(raise)[0]) gdk_window_raise(wdpy->window->window); else gdk_window_lower(wdpy->window->window); } else { /* This doesn't seem to iconify things, just kill them! XIconifyWindow(GDK_WINDOW_XDISPLAY(GTK_WIDGET(window)->window), GDK_WINDOW_XWINDOW(GTK_WIDGET(window)->window), DefaultScreen (GDK_DISPLAY ())); */ if(LOGICAL_DATA(raise)[0]) gtk_widget_show_all(wdpy->window); else gtk_widget_hide_all(wdpy->window); } LOGICAL_DATA(ans)[i] = TRUE; } UNPROTECT(1); gdk_flush(); return(ans); } USER_OBJECT_ RS_INTERNAL_GGOBI(getDisplays)(ggobid *gg) { USER_OBJECT_ ans; gint n, i; GList *dlist; n = g_list_length(gg->displays); PROTECT(ans = NEW_LIST(n)); i = 0; for (dlist = gg->displays; dlist ; dlist = dlist->next, i++) { SET_VECTOR_ELT(ans, i, RS_displayInstance((displayd*)dlist->data)); } UNPROTECT(1); return(ans); } /* Get a list of the displays in the specified ggobi. This works recursively */ USER_OBJECT_ RS_GGOBI(getDisplays)(USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); return(RS_INTERNAL_GGOBI(getDisplays)(gg)); } USER_OBJECT_ RS_GGOBI(getCurrentDisplay)(USER_OBJECT_ gobiId) { ggobid *gg = toGGobi(gobiId); USER_OBJECT_ ans; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); ans = toRPointer(gg->current_display, "GtkWidget"); return(ans); } rggobi/src/ggobi.c0000644000175100001440000001142412761555755013607 0ustar hornikusers#include "RSGGobi.h" #include "RUtils.h" #ifndef G_OS_WIN32 #include #include "R_ext/eventloop.h" #include #else #include /*static void __cdecl GtkEventThreadHandler(void *display);*/ void R_gtk_handle_events(); extern void (*R_gtkdo)(); extern __declspec(dllimport) void (*R_tcldo)(); #endif #include "R_ext/RS.h" /*XXX used to be R_IsNaNorNA, but no longer available for us. R_finite() excludes infinite values also. This is probably okay for now. */ int isMissingValue(double d) { return(!R_finite(d) || d == R_NaInt); } /* Create a ggobi instance and initialize. */ USER_OBJECT_ RS_GGOBI(init)(USER_OBJECT_ args, USER_OBJECT_ createInstance) { gint which, i; char **c_args; int n = GET_LENGTH(args); USER_OBJECT_ ans; c_args = g_malloc(sizeof(char *)*n); for(i = 0; i < n ; i++) { c_args[i] = (char *)CHAR_DEREF(STRING_ELT(args, i)); } if(LOGICAL_DATA(createInstance)[0]) { ggobid *gg; which = GGOBI(main)(n, c_args, false); gg = ggobi_get(which-1); gtk_action_set_visible(gtk_ui_manager_get_action(gg->main_menu_manager, "/menubar/File/Quit"), false); ans = RS_ggobiInstance(gg); } else { ggobiInit(&n, &c_args); ans = NEW_LOGICAL(1); LOGICAL_DATA(ans)[0] = TRUE; } g_free(c_args); GGobi_setMissingValueIdentifier(isMissingValue); gdk_flush(); return(ans); } /** Get a reference to a specific GGobi instance by indexing into the list of active/alive GGobis. */ USER_OBJECT_ RS_GGOBI(getGGobi)(USER_OBJECT_ which) { USER_OBJECT_ ans; ggobid *gg; int n = GET_LENGTH(which), i, index; PROTECT(ans = NEW_LIST(n)); for(i = 0; i < n ; i ++) { index = INTEGER_DATA(which)[i]; gg = ggobi_get(index-1); if(gg) { SET_VECTOR_ELT(ans,i, RS_ggobiInstance(gg)); } } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_ggobiInstance(ggobid *gg) { return(toRPointer(gg, "GGobi")); } USER_OBJECT_ RS_GGOBI(getDescription)(USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); GGobiData *d; gint numSlots = 3, numDatasets, i; DataMode mode; USER_OBJECT_ ans, names, tmp; const gchar *tmpname; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg == NULL) { RS_throwError("Invalid reference to GGobi instance"); } if(!gg->d) { return(NULL_USER_OBJECT); } PROTECT(ans = NEW_LIST(numSlots)); PROTECT(names = NEW_CHARACTER(numSlots)); SET_VECTOR_ELT(ans, 0, NEW_CHARACTER(1)); tmpname = GGOBI(getFileName(gg)); if (tmpname) SET_STRING_ELT(VECTOR_ELT(ans, 0), 0, COPY_TO_USER_STRING((gchar *)tmpname)); SET_STRING_ELT(names, 0, COPY_TO_USER_STRING("Filename")); SET_VECTOR_ELT(ans, 1, NEW_INTEGER(1)); mode = GGOBI(getDataMode)(gg); INTEGER_DATA(VECTOR_ELT(ans, 1))[0] = mode; PROTECT(tmp = NEW_CHARACTER(1)); SET_NAMES(VECTOR_ELT(ans, 1), tmp); UNPROTECT(1); SET_STRING_ELT(names, 1, COPY_TO_USER_STRING("Data mode")); numDatasets = g_slist_length (gg->d); SET_VECTOR_ELT(ans, 2, tmp = allocMatrix(INTSXP, numDatasets, 2)); for(i = 0; i < numDatasets ; i++) { d = (GGobiData *) g_slist_nth_data (gg->d, i); INTEGER_DATA(tmp)[i] = d->nrows; INTEGER_DATA(tmp)[i + numDatasets] = d->ncols; } SET_STRING_ELT(names, 2, COPY_TO_USER_STRING("Data dimensions")); SET_NAMES(ans, names); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(isValid)(USER_OBJECT_ gobi) { USER_OBJECT_ ans = NEW_LOGICAL(1); LOGICAL_DATA(ans)[0] = GGOBI_IS_GGOBI(toGGobi(gobi)); return(ans); } ggobid * toGGobi(USER_OBJECT_ s_ggobi) { if(inherits(s_ggobi, "GGobi")) { ggobid *gg; gg = ValidateGGobiRef(getPtrValue(s_ggobi), false); return(gg); } g_critical("A GGobi R object must inherit from class 'GGobiGGobi'"); return(NULL); } void RS_GGOBI(getNumGGobiInstances)(guint *ans) { ans[0] = GGOBI(getNumGGobis)(); } USER_OBJECT_ RS_GGOBI(close)(USER_OBJECT_ gobi) { ggobid *gg = toGGobi(gobi); USER_OBJECT_ ans = NEW_LOGICAL(1); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { LOGICAL_DATA(ans)[0] = GGOBI(close)(gg, true); gdk_flush(); } return(ans); } #include "GGStructSizes.c" USER_OBJECT_ RS_GGOBI(getStructSizes)(USER_OBJECT_ local) { const GGobi_StructSize *sizes; int n = 0, i; USER_OBJECT_ ans, names; if(LOGICAL_DATA(local)[0]) { sizes = GGOBI(getGGobiStructs)(&n); } else { sizes = GGOBI(getStructs)(&n); } PROTECT(ans = NEW_INTEGER(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n ; i++) { INTEGER_DATA(ans)[i] = sizes[i].size; SET_STRING_ELT(names, i, COPY_TO_USER_STRING(sizes[i].name)); } SET_NAMES(ans, names); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(ggobi_find_data_file)(USER_OBJECT_ name) { return(asRString(ggobi_find_data_file(asCString(name)))); } void RS_GGOBI(flush)() { gdk_flush(); } rggobi/src/data.c0000644000175100001440000000601112761555755013425 0ustar hornikusers#include "RSGGobi.h" #include "RUtils.h" /* Adds a dataset using data from the specified file */ USER_OBJECT_ RS_GGOBI(setFile)(USER_OBJECT_ fileName, USER_OBJECT_ smode, USER_OBJECT_ add, USER_OBJECT_ gobiId) { DataMode mode; ggobid *gg = toGGobi(gobiId); USER_OBJECT_ ans = NEW_INTEGER(1); const gchar *modeName = NULL; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(IS_CHARACTER(smode)) modeName = CHAR_DEREF(STRING_ELT(smode, 0)); else if(IS_INTEGER(smode)) { mode = INTEGER_DATA(smode)[0]; } if(fileset_read_init(CHAR_DEREF(STRING_ELT(fileName, 0)), modeName, NULL, gg)) { INTEGER_DATA(ans)[0] = g_slist_length(gg->d)-1; display_menu_build(gg); } else INTEGER_DATA(ans)[0] = -1; return(ans); } USER_OBJECT_ RS_GGOBI(getNumDatasets)(USER_OBJECT_ gobiID) { ggobid *gg = toGGobi(gobiID); USER_OBJECT_ ans = NEW_INTEGER(1); if(gg != NULL) INTEGER_DATA(ans)[0] = g_slist_length(gg->d); return(ans); } /* Returns the names of the datasets within the specified ggobid object. */ USER_OBJECT_ RS_GGOBI(getDatasetNames)(USER_OBJECT_ gobiId) { USER_OBJECT_ ans; ggobid *gg = toGGobi(gobiId); int i; GGobiData *d; GSList *tmp; int n; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); tmp = gg->d; n = g_slist_length(gg->d); PROTECT(ans = NEW_CHARACTER(n)); for(i = 0; i < n ; i++) { d =(GGobiData *) tmp->data; SET_STRING_ELT(ans, i, COPY_TO_USER_STRING(d->name)); tmp = tmp->next; } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getData)(USER_OBJECT_ datasetId) { GGobiData *d; USER_OBJECT_ ans, colnames, el; gint nr, nc; gint j, m; vartabled *vt; ans = NULL_USER_OBJECT; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if (!d) return(NULL_USER_OBJECT); nr = d->nrows; nc = d->ncols; if(nr == 0 || nc == 0) return(NULL_USER_OBJECT); PROTECT(colnames = NEW_CHARACTER(nc)); PROTECT(ans = NEW_LIST(nc)); for(j = 0; j < nc; j++) { vt = vartable_element_get(j, d); SET_STRING_ELT(colnames, j, COPY_TO_USER_STRING(ggobi_data_get_col_name(d, j))); PROTECT(el = NEW_NUMERIC(nr)); for (m = 0; m < nr; m++) { if(ggobi_data_is_missing(d, m, j)) NUMERIC_DATA(el)[m] = NA_REAL; else NUMERIC_DATA(el)[m] = d->raw.vals[m][j]; } if(vt->vartype == categorical) { PROTECT(el = createFactor(el, vt, d, j)); } SET_VECTOR_ELT(ans, j, el); UNPROTECT(1 + (vt->vartype == categorical)); } SET_NAMES(ans, colnames); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(getDataset)(USER_OBJECT_ which, USER_OBJECT_ gobiID) { int i, n; ggobid *gg = toGGobi(gobiID); USER_OBJECT_ ans = NULL_USER_OBJECT; if(gg == NULL) return(ans); n = GET_LENGTH(which); PROTECT(ans = NEW_LIST(n)); for(i = 0; i < n; i++) { int val = INTEGER_DATA(which)[i]; GGobiData *d = (GGobiData *) g_slist_nth_data(gg->d, val); if(d) { SET_VECTOR_ELT(ans, i, RS_datasetInstance(d)); } } UNPROTECT(1); return(ans); } rggobi/src/edges.c0000644000175100001440000001370312761555755013611 0ustar hornikusers#include "RSGGobi.h" #include "vars.h" USER_OBJECT_ RS_GGOBI(getSymbolicEdges)(USER_OBJECT_ edgesetId) { GGobiData *e = toData(edgesetId); USER_OBJECT_ ans, dim; gint i, ctr, n; g_return_val_if_fail(GGOBI_IS_DATA(e), NULL_USER_OBJECT); n = e->edge.n; if(!e) { PROBLEM "Invalid ggobi dataset identifier(s)" ERROR; } PROTECT(ans = NEW_CHARACTER(n * 2)); ctr = 0; for(i = 0; i < n; i++) { SET_STRING_ELT(ans, ctr, COPY_TO_USER_STRING(e->edge.sym_endpoints[i].a)); SET_STRING_ELT(ans, ctr+n, COPY_TO_USER_STRING(e->edge.sym_endpoints[i].b)); ctr++; } /* Now set the dim() on this vector to make it a matrix. The S code will put the dimnames on it. */ PROTECT(dim = NEW_INTEGER(2)); INTEGER_DATA(dim)[0] = n; INTEGER_DATA(dim)[1] = 2; SET_DIM(ans, dim); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(getConnectedEdges)(USER_OBJECT_ edgesetId, USER_OBJECT_ datasetId) { GGobiData *d = toData(datasetId); GGobiData *e = toData(edgesetId); gint ctr; USER_OBJECT_ ans, dim; gint i, n; endpointsd *endpoints; g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); g_return_val_if_fail(GGOBI_IS_DATA(e), NULL_USER_OBJECT); n = e->edge.n; endpoints = resolveEdgePoints(e, d); if(!endpoints) return(NULL_USER_OBJECT); PROTECT(ans = NEW_INTEGER(n * 2)); ctr = 0; for(i = 0; i < n; i++) { INTEGER_DATA(ans)[ctr] = endpoints[i].a; INTEGER_DATA(ans)[ctr+n] = endpoints[i].b; ctr++; } /* Now set the dim() on this vector to make it a matrix. The S code will put the dimnames on it. */ PROTECT(dim = NEW_INTEGER(2)); INTEGER_DATA(dim)[0] = n; INTEGER_DATA(dim)[1] = 2; SET_DIM(ans, dim); UNPROTECT(2); return(ans); } USER_OBJECT_ RS_GGOBI(createEdgeDataset)(USER_OBJECT_ numPoints, USER_OBJECT_ sname, USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); GGobiData *d; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(!gg) { PROBLEM "Invalid reference to GGobi instance" ERROR; } d = ggobi_data_new(INTEGER_DATA(numPoints)[0], 0); if(!d) { PROBLEM "Invalid reference to GGobi instance" ERROR; } GGobi_setDataName(CHAR_DEREF(STRING_ELT(sname, 0)), d); pipeline_init(d, gg); return(RS_datasetInstance(d)); } USER_OBJECT_ RS_GGOBI(setEdges)(USER_OBJECT_ x, USER_OBJECT_ y, USER_OBJECT_ append, USER_OBJECT_ datasetId) { USER_OBJECT_ ans = NULL_USER_OBJECT; ggobid *gg; GGobiData *e; int num = GET_LENGTH(x); gint i; e = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(e), NULL_USER_OBJECT); gg = e->gg; if(!e) return(ans); if(LOGICAL_DATA(append)[0] == FALSE) { g_free(e->edge.sym_endpoints); e->edge.n = 0; } if(num > 0) { edges_alloc (e->edge.n + num, e); for(i = 0; i < num; i++) { e->edge.sym_endpoints[i].a = g_strdup(CHAR_DEREF(STRING_ELT(x, i))); e->edge.sym_endpoints[i].b = g_strdup(CHAR_DEREF(STRING_ELT(y, i))); e->edge.sym_endpoints[i].jpartner = -1; } } unresolveAllEdgePoints(e); if(gg->current_display) { edgeset_add(gg->current_display); displays_plot(NULL, FULL, gg); } gdk_flush(); ans = RS_datasetInstance(e); return(ans); } /** Newer, but old, version for the edges interface using multiple (at least 2) datasets for the point set and the edge set. This sets the connections between nodes. We can either replace the existing edges or append to that collection. The source and destination variables identify the nodes in pairs. */ USER_OBJECT_ RS_GGOBI(setEdgeIndices)(USER_OBJECT_ x, USER_OBJECT_ y, USER_OBJECT_ append, USER_OBJECT_ datasetId) { USER_OBJECT_ ans = NULL_USER_OBJECT; GGobiData *e; int num = GET_LENGTH(x); gint i; e = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(e), NULL_USER_OBJECT); if(!e) return(ans); if(LOGICAL_DATA(append)[0] == FALSE) { edges_free (e, e->gg); e->edge.n = 0; #ifdef OLD_STYLE_IDS e->edge.old_endpoints = NULL; #endif } edges_alloc (e->edge.n + num, e); for(i = 0; i < num; i++) { #ifdef OBSOLETE_EDGE_CODE /* Without the update argument, this would be a very slow way of doing this. We would end up re-allocating the edges_endpoint each time. However, pre-allocating it to *num means we have to tell setObservationEdge something to avoid it reallocating space itself. */ GGOBI(setObservationEdge)(INTEGER_DATA(x)[i], INTEGER_DATA(y)[i], e, e->gg, false); #endif #ifdef OLD_STYLE_IDS e->edge.old_endpoints[i].a = INTEGER_DATA(x)[i]; e->edge.old_endpoints[i].b = INTEGER_DATA(y)[i]; e->edge.old_endpoints[i].jpartner = -1; #endif } #ifdef OLD_STYLE_IDS setOldEdgePartners(e->edge.old_endpoints, e->edge.n); #endif edgeset_add(e->gg->current_display); displays_plot(NULL, FULL, e->gg); gdk_flush(); ans = RS_datasetInstance(e); return(ans); } USER_OBJECT_ RS_GGOBI(setDisplayEdges)(USER_OBJECT_ dpys, USER_OBJECT_ edgeData, USER_OBJECT_ directed, USER_OBJECT_ On, USER_OBJECT_ ggobiId) { int i, n; USER_OBJECT_ ans; displayd *gdpy; GGobiData *edge = NULL; ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if (asCLogical(On)) { edge = toData(edgeData); g_return_val_if_fail(GGOBI_IS_DATA(edge), NULL_USER_OBJECT); } n = GET_LENGTH(dpys); PROTECT(ans = NEW_LIST(n)); for(i = 0; i < n ; i++) { GGobiData *old; gdpy = toDisplay(VECTOR_ELT(dpys, i)); g_return_val_if_fail(GGOBI_IS_DISPLAY(gdpy), NULL_USER_OBJECT); gdpy->options.edges_undirected_show_p = LOGICAL_DATA(On)[0]; if(GET_LENGTH(directed)) gdpy->options.edges_arrowheads_show_p = LOGICAL_DATA(directed)[0]; if(edge) { old = setDisplayEdge(gdpy, edge); if(old) { SET_VECTOR_ELT(ans, i, RS_datasetInstance(old)); } } } UNPROTECT(1); displays_plot(NULL, FULL, gg); gdk_flush(); return(ans); } rggobi/src/Makevars.in0000644000175100001440000000011412761555755014447 0ustar hornikusers PKG_CPPFLAGS=-DUSE_EXT_PTR=1 -D_R_=1 @GGOBI_CFLAGS@ PKG_LIBS=@GGOBI_LIBS@ rggobi/src/brush.c0000644000175100001440000000656212761555755013652 0ustar hornikusers#include "RSGGobi.h" #include #include "vars.h" USER_OBJECT_ RS_GGOBI(setBrushSize)(USER_OBJECT_ dims, USER_OBJECT_ ggobiId) { ggobid *gg; GGobiData *d = NULL; gint wd, ht; USER_OBJECT_ ans; gg = toGGobi(ggobiId); /*d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg;*/ if(d) { GGOBI(getBrushSize(&wd, &ht, gg)); /* We skip the setting if these values are both -1. Allows us to set or get with one function. */ if(INTEGER_DATA(dims)[0] > -1 && INTEGER_DATA(dims)[1] > -1) GGOBI(setBrushSize(INTEGER_DATA(dims)[0], INTEGER_DATA(dims)[1], gg)); ans = NEW_INTEGER(2); INTEGER_DATA(ans)[0] = wd; INTEGER_DATA(ans)[1] = ht; /* experiments */ brush_reset(gg->current_display, 0); /* displays_plot (NULL, FULL, gg); */ gdk_flush(); } else ans = NULL_USER_OBJECT; return(ans); } USER_OBJECT_ RS_GGOBI(setBrushLocation)(USER_OBJECT_ loc, USER_OBJECT_ datasetId) { ggobid *gg; GGobiData *d; USER_OBJECT_ ans; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { gint xx, yy; GGOBI(getBrushLocation (&xx, &yy, gg)); if(INTEGER_DATA(loc)[0] > -1 && INTEGER_DATA(loc)[1] > -1) GGOBI(setBrushLocation(INTEGER_DATA(loc)[0], INTEGER_DATA(loc)[1], gg)); ans = NEW_INTEGER(2); INTEGER_DATA(ans)[0] = xx; INTEGER_DATA(ans)[1] = yy; gdk_flush(); } else ans = NULL_USER_OBJECT; return(ans); } USER_OBJECT_ RS_GGOBI(setBrushColor)(USER_OBJECT_ cid, USER_OBJECT_ ggobiId) { USER_OBJECT_ ans = NULL_USER_OBJECT; ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { ans = RS_GGOBI(getBrushColor)(ggobiId); (void) GGOBI(setBrushColor)(INTEGER_DATA(cid)[0], gg); brush_reset(gg->current_display, 0); gdk_flush(); } return(ans); } USER_OBJECT_ RS_GGOBI(getBrushColor)(USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { USER_OBJECT_ ans; gint cid; cid = GGOBI(getBrushColor)(gg); PROTECT(ans = NEW_INTEGER(1)); INTEGER_DATA(ans)[0] = cid; SET_NAMES(ans, RS_INTERNAL_GGOBI(getColorName)(cid, gg)); UNPROTECT(1); return(ans); } else return(NULL); } USER_OBJECT_ RS_GGOBI(setBrushGlyph)(USER_OBJECT_ vals, USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { GGOBI(setBrushGlyph)(INTEGER_DATA(vals)[0], INTEGER_DATA(vals)[1], gg); brush_reset(gg->current_display, 0); gdk_flush(); } return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(getBrushGlyph)(USER_OBJECT_ ggobiId) { gint t, s; ggobid *gg; USER_OBJECT_ ans; gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(gg) { GGOBI(getBrushGlyph)(&t, &s, gg); ans = NEW_INTEGER(2); INTEGER_DATA(ans)[0] = t; INTEGER_DATA(ans)[1] = s; } else ans = NULL_USER_OBJECT; return(ans); } USER_OBJECT_ RS_INTERNAL_GGOBI(getColorName)(gint cid, ggobid *gg) { USER_OBJECT_ name; const gchar *colName; PROTECT(name = NEW_CHARACTER(1)); colName = GGOBI(getColorName)(cid, gg, false); if(colName) SET_STRING_ELT(name, 0, COPY_TO_USER_STRING(colName)); UNPROTECT(1); return(name); } rggobi/src/modes.c0000644000175100001440000000560512761555755013633 0ustar hornikusers#include "RSGGobi.h" #include #include USER_OBJECT_ RS_GGOBI(setIMode)(USER_OBJECT_ name, USER_OBJECT_ s_display) { displayd *display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); GGOBI(setIMode)(CHAR_DEREF(STRING_ELT(name, 0)), display->ggobi); gdk_flush(); return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(setPMode)(USER_OBJECT_ name, USER_OBJECT_ s_display) { displayd *display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); GGOBI(setPMode)(CHAR_DEREF(STRING_ELT(name, 0)), display->ggobi); return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(getIModeName)(USER_OBJECT_ s_display) { USER_OBJECT_ ans; const gchar *tmp; displayd *display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); tmp = GGOBI(getIModeName)(imode_get(display->ggobi)); PROTECT(ans = NEW_CHARACTER(1)); if(tmp && tmp[0]) SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(tmp)); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getPModeName)(USER_OBJECT_ s_display) { USER_OBJECT_ ans; const gchar *tmp; displayd *display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); tmp = GGOBI(getPModeName)(pmode_get(display, display->ggobi)); PROTECT(ans = NEW_CHARACTER(1)); if(tmp && tmp[0]) SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(tmp)); UNPROTECT(1); return(ans); } USER_OBJECT_ RS_INTERNAL_GGOBI(getModeNames)(USER_OBJECT_ s_display_type, const gchar* s_mode_type) { USER_OBJECT_ ans; GType type = g_type_from_name(asCString(s_display_type)); GGobiExtendedDisplayClass *display_class; xmlDocPtr doc; xmlXPathContextPtr ctx; xmlXPathObjectPtr result; gchar *expr; gint i; g_return_val_if_fail(type != G_TYPE_INVALID, NULL_USER_OBJECT); expr = g_strdup_printf("//menu[@action = '%s']/menuitem/@action", s_mode_type); display_class = g_type_class_peek(type); doc = xmlParseDoc(BAD_CAST(display_class->mode_ui_get(NULL))); ctx = xmlXPathNewContext(doc); result = xmlXPathEvalExpression(BAD_CAST(expr), ctx); PROTECT(ans = NEW_CHARACTER(xmlXPathNodeSetGetLength(result->nodesetval))); for (i = 0; i < GET_LENGTH(ans); i++) { xmlChar *str = xmlXPathCastNodeToString(xmlXPathNodeSetItem(result->nodesetval, i)); SET_STRING_ELT(ans, i, mkChar((gchar *)str)); free(str); } xmlXPathFreeObject(result); xmlXPathFreeContext(ctx); xmlFreeDoc(doc); g_free(expr); UNPROTECT(1); return ans; } USER_OBJECT_ RS_GGOBI(getPModeNames)(USER_OBJECT_ s_type_name) { USER_OBJECT_ ans; ans = RS_INTERNAL_GGOBI(getModeNames)(s_type_name, "PMode"); return(ans); } USER_OBJECT_ RS_GGOBI(getIModeNames)(USER_OBJECT_ s_type_name) { USER_OBJECT_ ans; ans = RS_INTERNAL_GGOBI(getModeNames)(s_type_name, "IMode"); return(ans); } rggobi/src/print.c0000644000175100001440000000356512761555755013663 0ustar hornikusers#include "RSGGobi.h" #include "print.h" PrintOptions *RSggobi_directPrintHandler(PrintOptions *options, displayd *dpy, ggobid *gg, GGobiPrintHandler *printHandler); USER_OBJECT_ RSGggobi_convertPrintOptions(PrintOptions *opts); USER_OBJECT_ RSggobi_setPrintHandler(USER_OBJECT_ func) { extern void R_PreserveObject(SEXP); DefaultPrintHandler.callback = RSggobi_directPrintHandler; R_PreserveObject(func); DefaultPrintHandler.userData = (void *)func; return(NULL_USER_OBJECT); } PrintOptions * RSggobi_directPrintHandler(PrintOptions *options, displayd *dpy, ggobid *gg, GGobiPrintHandler *printHandler) { SEXP e, opts; PROTECT(e = allocVector(LANGSXP, 3)); SETCAR(e, printHandler->userData); opts = RS_displayInstance(dpy); SETCAR(CDR(e), opts); opts = RSGggobi_convertPrintOptions(options); SETCAR(CDR(CDR(e)), opts); (void) eval(e, R_GlobalEnv); UNPROTECT(1); return(options); } USER_OBJECT_ RSGggobi_convertPrintOptions(PrintOptions *options) { int numSlots = 0; USER_OBJECT_ ans, snames, tmp; char *names[] = {"dims", "fileName", "colors"}; enum { PRINT_DIMS, PRINT_FILENAME, PRINT_COLORS}; numSlots = sizeof(names)/sizeof(names[0]); PROTECT(ans = NEW_LIST(numSlots)); PROTECT(snames = NEW_CHARACTER(numSlots)); SET_VECTOR_ELT(ans, PRINT_DIMS, tmp = NEW_INTEGER(2)); INTEGER_DATA(tmp)[0] = options->width; INTEGER_DATA(tmp)[1] = options->height; SET_STRING_ELT(snames, PRINT_DIMS, COPY_TO_USER_STRING(names[PRINT_DIMS])); SET_VECTOR_ELT(ans, PRINT_FILENAME, tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING(options->file->fileName)); SET_STRING_ELT(snames, PRINT_DIMS, COPY_TO_USER_STRING(names[PRINT_FILENAME])); SET_NAMES(ans, snames); PROTECT(tmp = NEW_CHARACTER(1)); SET_STRING_ELT(tmp, 0, COPY_TO_USER_STRING("ggobiPrintOptions")); SET_CLASS(ans, tmp); UNPROTECT(3); return(ans); } rggobi/src/dataset.c0000644000175100001440000005327312761555755014155 0ustar hornikusers#include "RSGGobi.h" USER_OBJECT_ RS_datasetInstance(GGobiData *d) { USER_OBJECT_ ans; ans = toRPointer(d, "GGobiData"); return(ans); } GGobiData * toData(USER_OBJECT_ d) { if(inherits(d, "GGobiData")) { GGobiData *data = getPtrValue(d); g_return_val_if_fail(GGOBI_IS_DATA(data), NULL); g_return_val_if_fail(ValidateGGobiRef(data->gg, false) != NULL, NULL); return(ValidateDatadRef(data, data->gg, false)); } g_critical("An R GGobi dataset object must inherit from GGobiData"); return(NULL); } USER_OBJECT_ RS_GGOBI(getVariableNames)(USER_OBJECT_ transformed, USER_OBJECT_ datasetId) { GGobiData *d = NULL; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) return(RS_INTERNAL_GGOBI(getVariableNames)(d)); else return(NULL_USER_OBJECT); } USER_OBJECT_ RS_INTERNAL_GGOBI(getVariableNames)(GGobiData *d) { USER_OBJECT_ ans; gint n, i; n = d->ncols; PROTECT(ans = NEW_CHARACTER(n)); for (i = 0; i < n ; i++) { SET_STRING_ELT(ans, i, COPY_TO_USER_STRING(ggobi_data_get_col_name(d, i))); } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getCaseIds)(USER_OBJECT_ datasetId) { GGobiData *d; USER_OBJECT_ ans; int n, m; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(!d) { PROBLEM "No such dataset" ERROR; } if(!d->rowIds) { return(NULL_USER_OBJECT); } n = d->nrows; PROTECT(ans = NEW_CHARACTER(n)); for(m = 0; m < n ; m++) { if(d->rowIds[m]) SET_STRING_ELT(ans, m, COPY_TO_USER_STRING(d->rowIds[m])); } UNPROTECT(1); return(ans); } /* returns selected indices, labeled by rownames */ USER_OBJECT_ RS_GGOBI(getSelectedIndices)(USER_OBJECT_ datasetId) { GGobiData *d; USER_OBJECT_ ans, names; d = toData(datasetId); if(d) { gint nr, i, m, ctr; gchar *name; nr = d->npts_under_brush; if (nr < 1) return(NULL_USER_OBJECT); PROTECT(ans = NEW_INTEGER(nr)); PROTECT(names = NEW_CHARACTER(nr)); ctr = 0; for(m = 0 ; m < d->nrows ; m++) { i = d->rows_in_plot.els[m]; if (d->pts_under_brush.els[i]) { INTEGER_DATA(ans)[ctr] = i + 1; /* Make these 1 based */ name = (gchar *) g_array_index (d->rowlab, gchar *, i); if(name && name[0]) SET_STRING_ELT(names, ctr, COPY_TO_USER_STRING (name)); ctr++; } } SET_NAMES(ans, names); UNPROTECT(2); } else ans = NULL_USER_OBJECT; return (ans); } USER_OBJECT_ RS_GGOBI(getRowNames)(USER_OBJECT_ data) { USER_OBJECT_ ans = NULL_USER_OBJECT; gint nr, m; GGobiData *d; d = toData(data); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) { nr = d->nrows; PROTECT(ans = NEW_CHARACTER(nr)); for (m = 0 ; m < nr ; m++) { SET_STRING_ELT(ans, m, COPY_TO_USER_STRING(g_array_index (d->rowlab, gchar *, m))); } UNPROTECT(1); } return (ans); } USER_OBJECT_ RS_GGOBI(getRowsInPlot)(USER_OBJECT_ datasetId) { USER_OBJECT_ ans = NULL_USER_OBJECT; GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) { gint i; PROTECT(ans = NEW_INTEGER(d->nrows_in_plot)); for(i = 0; i < d->nrows_in_plot ; i++) { INTEGER_DATA(ans)[i] = d->rows_in_plot.els[i]; } UNPROTECT(1); } return (ans); } /* shouldn't these be internal? */ USER_OBJECT_ RS_INTERNAL_GGOBI(getDataAttribute)(vector_b v) { USER_OBJECT_ ans = NULL_USER_OBJECT; gint i; PROTECT(ans = NEW_LOGICAL(v.nels)); for(i = 0; i < v.nels; i++) { LOGICAL_DATA(ans)[i] = v.els[i]; } UNPROTECT(1); return (ans); } void RS_INTERNAL_GGOBI(setDataAttribute)(vector_b *v, USER_OBJECT_ vals, GGobiData *d) { if(v) { gint i, n; n = GET_LENGTH(vals); if(n != d->nrows) { PROBLEM "number of values must be the same as the number of records in the GGobi dataset" ERROR; } vectorb_realloc(v, n); for(i = 0; i < n; i++) { v->els[i] = LOGICAL_DATA(vals)[i]; } } } USER_OBJECT_ RS_GGOBI(getSampledIndices)(USER_OBJECT_ datasetId) { GGobiData *d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); return(RS_INTERNAL_GGOBI(getDataAttribute)(d->sampled)); } USER_OBJECT_ RS_GGOBI(setSampledIndices)(USER_OBJECT_ vals, USER_OBJECT_ datasetId) { GGobiData *d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(setDataAttribute)(&(d->sampled), vals, d); rows_in_plot_set(d, d->gg); return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(getExcludedIndices)(USER_OBJECT_ datasetId) { GGobiData *d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); return(RS_INTERNAL_GGOBI(getDataAttribute)(d->excluded)); } USER_OBJECT_ RS_GGOBI(setExcludedIndices)(USER_OBJECT_ vals, USER_OBJECT_ datasetId) { GGobiData *d = toData(datasetId); ggobid *gg = d->gg; g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(setDataAttribute)(&(d->excluded), vals, d); subset_apply(d, gg); GGOBI(update_data)(d, gg); displays_tailpipe (FULL, gg); return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(setCasesHidden)(USER_OBJECT_ vals, USER_OBJECT_ which, USER_OBJECT_ datasetId) { gint i; ggobid *gg; GGobiData *d; USER_OBJECT_ ans = NEW_LOGICAL(1); d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { int num = GET_LENGTH(vals); for (i = 0; i < num; i++) { GGOBI(setCaseHidden)(INTEGER_DATA(which)[i], LOGICAL_DATA(vals)[i], d, gg); } displays_plot (NULL, FULL, gg); gdk_flush(); LOGICAL_DATA(ans)[0] = TRUE; } return(ans); } USER_OBJECT_ RS_GGOBI(getCasesHidden)(USER_OBJECT_ datasetId) { USER_OBJECT_ ans = NULL_USER_OBJECT; ggobid *gg; GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { gint num = d->nrows, m; PROTECT(ans = NEW_LOGICAL(num)); for(m = 0; m < num; m++) { LOGICAL_DATA(ans)[m] = GGOBI(getCaseHidden)(m, d, gg); } UNPROTECT(1); } return(ans); } /* This allows us to add a variable to the existing dataset. If there are no variables currently in the dataset, the first one added will induce a call to GGOBI(setData) and datad_init() which will create the relevant tab in the notebook. However, it will also slight mess up with the addition of the variables into the control panel (e.g. create X, Y and Z buttons for no good reason.) We might want to inhibit this and wait until the end. */ USER_OBJECT_ RS_GGOBI(addVariable)(USER_OBJECT_ vals, USER_OBJECT_ name, USER_OBJECT_ levels, USER_OBJECT_ values, USER_OBJECT_ datasetId) { GGobiData *d; ggobid *gg; USER_OBJECT_ ans = NULL_USER_OBJECT; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { int i; PROTECT(ans = NEW_INTEGER(1)); if(GET_LENGTH(levels)) { USER_OBJECT_ names; int n = GET_LENGTH(levels); char **levelValues; names = GET_NAMES(levels); levelValues = (char **) S_alloc(n, sizeof(char *)); for(i = 0; i < n ; i++) { levelValues[i] = (char *)CHAR_DEREF(STRING_ELT(names, i)); } INTEGER_DATA(ans)[0] = GGOBI(addCategoricalVariable)(NUMERIC_DATA(vals), GET_LENGTH(vals), (char *)CHAR_DEREF(STRING_ELT(name,0)), levelValues, INTEGER_DATA(values), INTEGER_DATA(levels), n, true, d, gg); } else { INTEGER_DATA(ans)[0] = GGOBI(addVariable)(NUMERIC_DATA(vals), GET_LENGTH(vals), (char *)CHAR_DEREF(STRING_ELT(name,0)), true, d, gg); } UNPROTECT(1); } else { PROBLEM "Cannot resolve dataset in GGobi" ERROR; } return(ans); } USER_OBJECT_ RS_GGOBI(datad_init)(USER_OBJECT_ cleanup, USER_OBJECT_ datasetId) { GGobiData *d; ggobid *gg; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { datad_init(d, gg, LOGICAL_DATA(cleanup)[0]); } return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(setVariableValues)(USER_OBJECT_ vals, USER_OBJECT_ rowIds, USER_OBJECT_ colId, USER_OBJECT_ update, USER_OBJECT_ datasetId) { ggobid *gg; GGobiData *d; gint i, num, var, row; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; num = GET_LENGTH(rowIds); var = INTEGER_DATA(colId)[0]; for (i=0;i < num; i++) { row = INTEGER_DATA(rowIds)[i]; d->raw.vals[row][var] = d->tform.vals[row][var] = NUMERIC_DATA(vals)[i]; } /* splot_reverse_pipeline (gg->current_splot, row, &gg->movepts.eps, true, true, gg); */ /* * This call does too much. Need to find a routine that does * just what is needed. pipeline_init (d, gg); displays_plot(NULL, FULL, gg); */ if(LOGICAL_DATA(update)[0]) { tform_to_world (d, gg); displays_tailpipe (FULL, gg); gdk_flush(); } return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(setVariableNames)(USER_OBJECT_ vars, USER_OBJECT_ names, USER_OBJECT_ datasetId) { gint i, which; ggobid *gg; GGobiData *d; int num = GET_LENGTH(vars); gchar **curNames; USER_OBJECT_ ans; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; PROTECT(ans = NEW_CHARACTER(num)); curNames = GGOBI(getVariableNames)(false, d, gg); for (i = 0; i < num; i++) { which = INTEGER_DATA(vars)[i]; SET_STRING_ELT(ans, i, COPY_TO_USER_STRING(curNames[which])); GGOBI(setVariableName)(which, (char *)CHAR_DEREF(STRING_ELT(names,i)), false, d, gg); GGOBI(setVariableName)(which, (char *)CHAR_DEREF(STRING_ELT(names,i)), true, d, gg); } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(varpanel_populate)(USER_OBJECT_ datasetId) { GGobiData *d; ggobid *gg; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { varpanel_populate(d, gg); } return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(getVariable)(int which, GGobiData *d) { int nr = d->nrows_in_plot, i, m; float f; USER_OBJECT_ ans; vartabled *vt; vt = vartable_element_get (which, d); if(vt->vartype == categorical) { PROTECT(ans = NEW_INTEGER(nr)); } else { PROTECT(ans = NEW_NUMERIC(nr)); } for(m = 0; m < nr; m++) { i = d->rows_in_plot.els[m]; f = d->raw.vals[i][which]; if(vt->vartype == categorical) INTEGER_DATA(ans)[m] = f; else NUMERIC_DATA(ans)[m] = f; } if(vt->vartype == categorical) { USER_OBJECT_ levs; nr = vt->nlevels; PROTECT(levs = NEW_CHARACTER(nr)); for(m = 0; m < nr; m++) { gchar* tmp; i = d->rows_in_plot.els[m]; tmp = (gchar *) vt->level_names[i]; SET_STRING_ELT(levs, m, COPY_TO_USER_STRING(tmp)); } SET_LEVELS(ans, levs); PROTECT(levs = NEW_CHARACTER(1)); SET_STRING_ELT(levs, 0, COPY_TO_USER_STRING("factor")); SET_CLASS(ans, levs); UNPROTECT(2); } UNPROTECT(1); return(ans); } USER_OBJECT_ RS_GGOBI(getVariables)(USER_OBJECT_ which, USER_OBJECT_ datasetId) { GGobiData *d = NULL; USER_OBJECT_ ans = NULL_USER_OBJECT; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) { int n = GET_LENGTH(which), i; PROTECT(ans = NEW_LIST(n)); for(i = 0; i < n; i++) { SET_VECTOR_ELT(ans, i, RS_GGOBI(getVariable)(INTEGER_DATA(which)[i]-1, d)); } UNPROTECT(1); } else { PROBLEM "Cannot identify dataset in GGobi" ERROR; } return(ans); } USER_OBJECT_ RS_GGOBI(createEmptyData)(USER_OBJECT_ snrow, USER_OBJECT_ name, USER_OBJECT_ description, USER_OBJECT_ gobiId) { ggobid *gg = toGGobi(gobiId); GGobiData *d; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if((gg = ValidateGGobiRef(gg, false)) == NULL) { return(R_NilValue); } d = ggobi_data_new(INTEGER_DATA(snrow)[0], 0); if(!d) { PROBLEM "Can't create GGobi dataste" ERROR; } GGobi_setDataName(CHAR_DEREF(STRING_ELT(name, 0)), d); if(!d->input) d->input = g_malloc(sizeof(InputDescription)); d->input->fileName = g_strdup(CHAR_DEREF(STRING_ELT(description, 0))); pipeline_init(d, gg); rows_in_plot_set (d, gg); return(RS_datasetInstance(d)); } /* Set the names of rows/observations identified by the elements of the indices array which should be between 0 and nrows - 1. */ USER_OBJECT_ RS_GGOBI(setRowNames)(USER_OBJECT_ names, USER_OBJECT_ indices, USER_OBJECT_ datasetId) { GGobiData *d; gchar *tmp, *lbl; gint i; USER_OBJECT_ ans = NULL_USER_OBJECT; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) { gboolean getOldValues = true; int num = GET_LENGTH(names); int which; if(!d->rowlab->data) { rowlabels_alloc(d); getOldValues = false; } if(getOldValues) PROTECT(ans = NEW_CHARACTER(num)); for(i = 0; i < num; i++) { which = INTEGER_DATA(indices)[i]; if(getOldValues) { tmp = (gchar *) g_array_index (d->rowlab, gchar *, which); /* Copy and free the old value! Currently not freeing this. Bad things happen. Need to find out what the g_array_index and insert_val are doing with memory management! */ if(tmp && tmp[0]) { SET_STRING_ELT(ans, i, COPY_TO_USER_STRING(tmp)); /* g_free(tmp); */ tmp = NULL; } } lbl = g_strdup(CHAR_DEREF(STRING_ELT(names, i))); g_array_insert_val (d->rowlab, which, lbl); } if(getOldValues) UNPROTECT(1); } return(ans); } /* Sets the IDs in a dataset - by mikel */ void RS_GGOBI(setIDs)(USER_OBJECT_ ids, USER_OBJECT_ datasetId) { GGobiData *d; gchar **g_ids; int n, i; d = toData(datasetId); g_return_if_fail(GGOBI_IS_DATA(d)); if(d) { n = GET_LENGTH(ids); g_ids = (gchar **) S_alloc(n , sizeof(gchar*)); for(i = 0; i < n ; i++) g_ids[i] = (char *)CHAR_DEREF(STRING_ELT(ids, i)); datad_record_ids_set(d, g_ids, true); } } /* The C-side of R's setData.. appends datasets */ USER_OBJECT_ RS_GGOBI(addData)(USER_OBJECT_ values, USER_OBJECT_ rowNames, USER_OBJECT_ colNames, USER_OBJECT_ dims, USER_OBJECT_ description, USER_OBJECT_ name, USER_OBJECT_ ids, USER_OBJECT_ gobiID ) { InputDescription *desc; ggobid *gg = toGGobi(gobiID); GGobiData *d = NULL; gint i, j; USER_OBJECT_ num; gchar *logical_levels[] = { "FALSE", "TRUE" }; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); desc = g_new0(InputDescription, 1); desc->fileName = g_strdup(asCString(description)); desc->mode = Sprocess_data; d = ggobi_data_new(INTEGER_DATA(dims)[0], INTEGER_DATA(dims)[1]); ggobi_data_set_name(d, (char *)asCString(name), NULL); ggobi_data_set_row_labels(d, asCStringArray(rowNames)); datad_record_ids_set(d, asCStringArray(ids), true); /* ids MUST be given */ for (i = 0; i < GET_LENGTH(values); i++) { USER_OBJECT_ vector = VECTOR_ELT(values, i); vartabled *vt = vartable_element_get(i, d); ggobi_data_set_col_name(d, i, (char *)asCString(STRING_ELT(colNames, i))); if (TYPEOF(vector) == INTSXP) { if (isFactor(vector)) { USER_OBJECT_ levels = getAttrib(vector, install("levels")); vartable_element_categorical_init(vt, GET_LENGTH(levels), asCStringArray(levels), NULL, NULL); } for (j = 0; j < INTEGER_DATA(dims)[0]; j++) ggobi_data_set_raw_value(d, j, i, (gdouble)INTEGER_DATA(vector)[j]); } else if (IS_NUMERIC(vector)) ggobi_data_set_raw_values(d, i, NUMERIC_DATA(vector)); else if (IS_LOGICAL(vector)) { vartable_element_categorical_init(vt, 2, logical_levels, NULL, NULL); for (j = 0; j < INTEGER_DATA(dims)[0]; j++) ggobi_data_set_raw_value(d, j, i, (gdouble)LOGICAL_DATA(vector)[j]); } else g_critical("Unknown R data type in column %d", i); } gg->input = desc; datad_init (d, gg, false); num = NEW_INTEGER(1); INTEGER_DATA(num)[0] = g_slist_length(gg->d); gdk_flush(); return(num); } USER_OBJECT_ RS_GGOBI(setDataName)(USER_OBJECT_ name, USER_OBJECT_ datasetId) { GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); GGobi_setDataName(CHAR_DEREF(STRING_ELT(name, 0)), d); return(NULL_USER_OBJECT); } /*-------------------------------------------------------------------------*/ /* glyphs */ /*-------------------------------------------------------------------------*/ USER_OBJECT_ RS_GGOBI(setCaseGlyphs)(USER_OBJECT_ vals, USER_OBJECT_ sizes, USER_OBJECT_ which, USER_OBJECT_ datasetId) { ggobid *gg; GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { gint i, id; int num = GET_LENGTH(which); for(i = 0; i < num; i++) { id = INTEGER_DATA(which)[i]; GGOBI(setCaseGlyph)(id, INTEGER_DATA(vals)[i], INTEGER_DATA(sizes)[i], d, gg); } clusters_set (d, gg); cluster_table_update (d, gg); /* dfs, May 20 2005 */ displays_plot(NULL, FULL, gg); gdk_flush(); } return(NULL_USER_OBJECT); } USER_OBJECT_ RS_GGOBI(getCaseGlyphs)(USER_OBJECT_ ids, USER_OBJECT_ datasetID) { USER_OBJECT_ ans, types, sizes, names; gint i, id, n; gboolean all = true; ggobid *gg; GGobiData *d; d = toData(datasetID); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(!d) return(NULL_USER_OBJECT); gg = d->gg; if(GET_LENGTH(ids) > 0) { n = GET_LENGTH(ids); all = false; } else n = d->nrows; PROTECT(types = NEW_INTEGER(n)); PROTECT(sizes = NEW_INTEGER(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n; i++) { gchar const *typeName; int type; if(all) { id = i; } else { id = INTEGER_DATA(ids)[i]; } /* Don't convert to names. */ INTEGER_DATA(types)[i] = type = GGOBI(getCaseGlyphType)(id, d, gg); typeName = GGOBI(getGlyphTypeName)(type); SET_STRING_ELT(names, i, COPY_TO_USER_STRING(typeName)); INTEGER_DATA(sizes)[i] = GGOBI(getCaseGlyphSize)(id, d, gg); } SET_NAMES(types, names); PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, types); SET_VECTOR_ELT(ans, 1, sizes); PROTECT(names = NEW_CHARACTER(2)); SET_STRING_ELT(names, 0, COPY_TO_USER_STRING("type")); SET_STRING_ELT(names, 1, COPY_TO_USER_STRING("size")); SET_NAMES(ans, names); UNPROTECT(5); return(ans); } USER_OBJECT_ RS_GGOBI(setCaseColors)(USER_OBJECT_ vals, USER_OBJECT_ which, USER_OBJECT_ datasetId) { gint i, id; USER_OBJECT_ ans = NULL_USER_OBJECT; gint num = GET_LENGTH(which); ggobid *gg; GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(d) { for(i = 0; i < num; i++) { id = INTEGER_DATA(which)[i]; GGOBI(setCaseColor)(id, INTEGER_DATA(vals)[i] - 1, d, gg); } clusters_set (d, gg); /* reactivated, May 20 2005 */ cluster_table_update (d, gg); /* added, May 20 2005 -- dfs */ displays_plot(NULL, FULL, gg); gdk_flush(); } return(ans); } USER_OBJECT_ RS_GGOBI(getCaseColors)(USER_OBJECT_ ids, USER_OBJECT_ datasetId) { USER_OBJECT_ colors, names; gint i, id, n, color; gboolean all = true; const gchar *colorName; ggobid *gg; GGobiData *d; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; if(GET_LENGTH(ids) > 0) { n = GET_LENGTH(ids); all = false; } else n = d->nrows; PROTECT(colors = NEW_INTEGER(n)); PROTECT(names = NEW_CHARACTER(n)); for(i = 0; i < n; i++) { if(all) { id = i; } else { id = INTEGER_DATA(ids)[i]; } /* Don't convert to names. */ INTEGER_DATA(colors)[i] = color = GGOBI(getCaseColor)(id, d, gg); colorName = GGOBI(getColorName)(color, gg, true); if(colorName && colorName[0]) SET_STRING_ELT(names, i, COPY_TO_USER_STRING(colorName)); } SET_NAMES(colors, names); UNPROTECT(2); return(colors); } USER_OBJECT_ RS_GGOBI(setVariableTypes)(USER_OBJECT_ vars, USER_OBJECT_ values, USER_OBJECT_ datasetId) { gint i, which; ggobid *gg; GGobiData *d; int num; USER_OBJECT_ ans; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; num = GET_LENGTH(vars); PROTECT(ans = NEW_INTEGER(num)); for (i = 0; i < num; i++) { which = INTEGER_DATA(vars)[i]; } UNPROTECT(1); return(ans); } /* Get the source name associated with the specified GGobiData In the case of loading an R data frame, for example, this returns a string like 'data.frame(data)'. If the data originated from a file, then the name of that file is returned. */ USER_OBJECT_ RS_GGOBI(getSourceName)(USER_OBJECT_ datasetId) { ggobid *gg; USER_OBJECT_ ans = NULL_USER_OBJECT; GGobiData *d; if(GET_LENGTH(datasetId)) { d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; PROTECT(ans = NEW_CHARACTER(1)); if(GGOBI(getFileName)(gg)) SET_STRING_ELT(ans, 0, COPY_TO_USER_STRING(GGOBI(getFileName)(gg))); UNPROTECT(1); } return(ans); } USER_OBJECT_ RS_GGOBI(datasetDim)(USER_OBJECT_ data) { USER_OBJECT_ ans = NULL_USER_OBJECT; GGobiData *d; d = toData(data); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); if(d) { ans = NEW_INTEGER(2); INTEGER_DATA(ans)[0] = GGOBI(nrecords)(d); INTEGER_DATA(ans)[1] = GGOBI(ncols)(d); } return(ans); } rggobi/src/plots.c0000644000175100001440000000221312761555755013655 0ustar hornikusers#include "RSGGobi.h" #include "vars.h" /* Gets the active plot in a GGobi context */ /* Returns a list containing the display reference and the plot index */ USER_OBJECT_ RS_GGOBI(getActivePlot)(USER_OBJECT_ ggobiId) { USER_OBJECT_ ans; ggobid *gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); PROTECT(ans = NEW_LIST(2)); SET_VECTOR_ELT(ans, 0, RS_displayInstance(gg->current_display)); SET_VECTOR_ELT(ans, 1, asRInteger(GGOBI(getCurrentPlotIndex)(gg))); UNPROTECT(1); return(ans); } /* Sets a plot as the active plot given a display and a plot index */ USER_OBJECT_ RS_GGOBI(setActivePlot)(USER_OBJECT_ s_display, USER_OBJECT_ s_plot) { USER_OBJECT_ ans = NEW_LOGICAL(1); displayd *display; splotd *sp; display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); display_set_current(display, display->ggobi); sp = GGOBI(getPlot)(display, INTEGER_DATA(s_plot)[0]); g_return_val_if_fail(sp != NULL, NULL_USER_OBJECT); GGOBI(splot_set_current_full)(display, sp, display->ggobi); LOGICAL_DATA(ans)[0] = 1; gdk_flush(); return (ans); } rggobi/src/RSGGobi.h0000644000175100001440000000134412761555755013761 0ustar hornikusers#ifndef RSGGOBI_H #define RSGGOBI_H #include "RSCommon.h" #include "GGobiAPI.h" #include "conversion.h" /* Identifies a routine that interfaces directly with R */ #define RS_GGOBI(a) RS_GGOBI_##a /* Identifies a routine that cannot be called directly from R/S via a .C or .Call, but that is part of this package's symbol table. */ #define RS_INTERNAL_GGOBI(a) RSint_GGOBI_##a USER_OBJECT_ RS_INTERNAL_GGOBI(getDisplay)(gboolean full, displayd *display, ggobid *gg); void RGGobiErrorHandler(int status); int isMissingValue(double d); #include "externs.h" USER_OBJECT_ RS_INTERNAL_GGOBI(getVariableNames)(GGobiData *d); USER_OBJECT_ RS_INTERNAL_GGOBI(getColorName)(gint cid, ggobid *gg); #include "RSGGobiEntryPoints.h" #endif rggobi/src/Makevars.win0000644000175100001440000000210312761555755014636 0ustar hornikusersPKG_CPPFLAGS=-D_R_=1 -DUSE_R=1 -mms-bitfields -I$(GGOBI_PATH)/include/gtk-2.0 -I$(GGOBI_PATH)/include/gdk-pixbuf-2.0 -I$(GGOBI_PATH)/../lib/gtk-2.0/include -I$(GGOBI_PATH)/include/atk-1.0 -I$(GGOBI_PATH)/include/cairo -I$(GGOBI_PATH)/include/pango-1.0 -I$(GGOBI_PATH)/include/glib-2.0 -I$(GGOBI_PATH)/../lib/glib-2.0/include -I$(GGOBI_PATH)/include/libxml2 -I$(GGOBI_PATH)/include -I$(GGOBI_PATH)/include/ggobi -I$(R_HOME)/include -I$(GGOBI_PATH)/include/libxml ifeq "$(WIN)" "64" PKG_LIBS=-L$(GGOBI_PATH)/lib -lgtk-win32-2.0-0 -lgdk-win32-2.0-0 -latk-1.0-0 -lgdk_pixbuf-2.0-0 -lpangowin32-1.0-0 -lgdi32 -lpangocairo-1.0-0 -lpango-1.0-0 -lcairo-2 -lgobject-2.0-0 -lgmodule-2.0-0 -lglib-2.0-0 -lintl-8 -lxml2-2 -lzlib1 -lws2_32 -L$(GGOBI_PATH)/../lib -L$(GGOBI_PATH)/../ -lggobi else PKG_LIBS=-L$(GGOBI_PATH)/lib -lgtk-win32-2.0-0 -lgdk-win32-2.0-0 -latk-1.0-0 -lgdk_pixbuf-2.0-0 -lpangowin32-1.0-0 -lgdi32 -lpangocairo-1.0-0 -lpango-1.0-0 -lcairo-2 -lgobject-2.0-0 -lgmodule-2.0-0 -lglib-2.0-0 -lintl -liconv -lxml2 -lzlib1 -lws2_32 -L$(GGOBI_PATH)/../lib -L$(GGOBI_PATH)/../ -lggobi endif rggobi/src/init.c0000644000175100001440000000520512761555755013463 0ustar hornikusers#include "RSGGobi.h" #include "GGobiAPI.h" #include #define CENTRY(a, n) {#a, (DL_FUNC) &RS_GGOBI(a), n} static R_CMethodDef cmethods[] = { CENTRY(getNumGGobiInstances, 1), CENTRY(flush, 0) , {NULL} }; static R_CallMethodDef callMethods[] = { CENTRY(init, 2), CENTRY(getBrushColor, 0), CENTRY(setBrushColor, 1), CENTRY(getBrushGlyph, 0), CENTRY(setBrushGlyph, 1), CENTRY(setBrushSize, 2), CENTRY(setBrushLocation, 2), CENTRY(getColorSchemes, 0), CENTRY(addColorScheme, 4), CENTRY(getActiveColorScheme, 1), CENTRY(setActiveColorScheme, 2), CENTRY(setEdges, 5), CENTRY(getVariables, 3), CENTRY(getData, 2), CENTRY(setFile, 4), CENTRY(getNumDatasets, 1), CENTRY(varpanel_populate, 2), CENTRY(getDisplayDataset, 2), CENTRY(getDataset, 2), CENTRY(getCurrentDisplayType, 1), CENTRY(getDisplayOptions, 2), CENTRY(setDisplayOptions, 3), CENTRY(getActivePlot, 1), CENTRY(setActivePlot, 2), CENTRY(closeDisplay, 2), CENTRY(getDatasetNames, 1), CENTRY(getDescription, 1), CENTRY(getVariableNames, 3), CENTRY(getCaseGlyphs, 3), CENTRY(setCaseGlyphs, 5), CENTRY(getCaseColors, 3), CENTRY(setCaseColors, 4), /* CENTRY(setMissing), */ CENTRY(close, 1), CENTRY(isValid, 1), CENTRY(setIMode, 2), CENTRY(setPMode, 2), CENTRY(getPModeName, 1), CENTRY(getIModeName, 1), CENTRY(getCasesHidden, 2), CENTRY(setCasesHidden, 4), CENTRY(getMainMenubar, 1), CENTRY(getDisplayMenubar, 2), #if 0 CENTRY(setPlotRange), CENTRY(getPlotRange), #endif CENTRY(getSymbolicEdges, 2), CENTRY(getConnectedEdges, 3), CENTRY(createEdgeDataset, 3), CENTRY(setDisplayEdges, 5), CENTRY(raiseOrLowerDisplays, 4), CENTRY(getCurrentDisplay, 1), CENTRY(getMainWindow, 1), CENTRY(setVariableNames, 4), CENTRY(setVariableValues, 6), CENTRY(addVariable, 6), /* CENTRY(getPlugins, 1), CENTRY(getPluginInfo, 1),*/ CENTRY(getExcludedIndices, 2), CENTRY(setExcludedIndices, 3), CENTRY(getSampledIndices, 2), CENTRY(setSampledIndices, 3), CENTRY(getRowsInPlot, 2), CENTRY(getRowNames, 2), CENTRY(setRowNames, 4), CENTRY(getDisplayTypes, 0), CENTRY(getNumPlotsInDisplay, 2), CENTRY(getNumDisplays, 1), CENTRY(getNumberedKeyHandler, 1), CENTRY(setNumberedKeyHandler, 3), CENTRY(setVariableTypes, 4), CENTRY(setAsTimeVariables, 4), CENTRY(getPModeNames, 1), CENTRY(getIModeNames, 1) , {NULL} }; void R_init_Rggobi(DllInfo *dll) { g_debug("Registering symbols"); R_registerRoutines(dll, cmethods, callMethods, NULL, NULL); R_useDynamicSymbols(dll, TRUE); } rggobi/src/display.c0000644000175100001440000003262212761555755014170 0ustar hornikusers#include "RSGGobi.h" #include "RUtils.h" #include #include "vars.h" USER_OBJECT_ RS_GGOBI(createDisplay)(USER_OBJECT_ stype, USER_OBJECT_ svars, USER_OBJECT_ datasetId, USER_OBJECT_ useWindow) { GGobiData *d; ggobid *gg; displayd *display = NULL; GType type; GGobiExtendedDisplayClass *klass; gboolean use_window = asCLogical(useWindow); d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; type = g_type_from_name(asCString(stype)); klass = GGOBI_EXTENDED_DISPLAY_CLASS(g_type_class_peek(type)); if(!klass) { PROBLEM "Unrecognized display type" ERROR; } if(klass->createWithVars && GET_LENGTH(svars)) { gint nvars, *vars, i; nvars = GET_LENGTH(svars); vars = g_malloc(sizeof(gint)*nvars); for(i = 0; i < nvars; i++) vars[i] = INTEGER_DATA(svars)[i]; display = klass->createWithVars(use_window, false, nvars, vars, d, gg); } else if(klass->create) display = klass->create(use_window, false, NULL, d, gg); if(!display) { PROBLEM "Couldn't create the display" ERROR; } display_add(display, gg); gdk_flush(); return(RS_displayInstance(display)); } /** This is called when we have reset all the variables in the different splots within a display. The intent is that this will recompute everything, including the positions of the points/glyphs. Currently this is not doing that. Need to call some other method. */ USER_OBJECT_ RS_GGOBI(updateDisplay)(USER_OBJECT_ dpy, USER_OBJECT_ ggobiId) { USER_OBJECT_ ans = NEW_LOGICAL(1); ggobid *gg; displayd *display; gg = toGGobi(ggobiId); g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); display = toDisplay(dpy); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); display_tailpipe(display, FULL, gg); LOGICAL_DATA(ans)[0] = TRUE; return(ans); } /* Ideally the GGobi would be a property of the display, allowing access with RGtk2, but this is not so... */ USER_OBJECT_ RS_GGOBI(getGGobiForDisplay)(USER_OBJECT_ s_display) { displayd *display = toDisplay(s_display); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); return RS_ggobiInstance(display->ggobi); } /* Returns the number of splotd objects contained within a a given displayd object. */ USER_OBJECT_ RS_GGOBI(getNumPlotsInDisplay)(USER_OBJECT_ dpy) { displayd *display; gint len; USER_OBJECT_ ans = NEW_INTEGER(1); display = toDisplay(dpy); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); len = g_list_length(display->splots); INTEGER_DATA(ans)[0] = len; return(ans); } USER_OBJECT_ RS_GGOBI(getDisplayOptions)(USER_OBJECT_ which) { USER_OBJECT_ ans, names; gint NumOptions = 8; DisplayOptions *options; if (GET_LENGTH(which) == 0) options = GGOBI(getDefaultDisplayOptions)(); else { displayd *display = toDisplay(which); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); options = &(display->options); } g_return_val_if_fail(options != NULL, NULL_USER_OBJECT); PROTECT(ans = NEW_LOGICAL(NumOptions)); PROTECT(names = NEW_CHARACTER(NumOptions)); LOGICAL_DATA(ans)[DOPT_POINTS] = options->points_show_p; SET_STRING_ELT(names, DOPT_POINTS, COPY_TO_USER_STRING("Show points")); LOGICAL_DATA(ans)[DOPT_AXES] = options->axes_show_p; SET_STRING_ELT(names, DOPT_AXES, COPY_TO_USER_STRING("Show axes")); LOGICAL_DATA(ans)[DOPT_AXESLAB] = options->axes_label_p; SET_STRING_ELT(names, DOPT_AXESLAB, COPY_TO_USER_STRING("Show tour axes")); LOGICAL_DATA(ans)[DOPT_AXESVALS] = options->axes_values_p; SET_STRING_ELT(names, DOPT_AXESVALS, COPY_TO_USER_STRING("Show axes labels")); LOGICAL_DATA(ans)[DOPT_EDGES_U] = options->edges_undirected_show_p; SET_STRING_ELT(names, DOPT_EDGES_U, COPY_TO_USER_STRING("Undirected edges")); LOGICAL_DATA(ans)[DOPT_EDGES_A] = options->edges_arrowheads_show_p; SET_STRING_ELT(names, DOPT_EDGES_A, COPY_TO_USER_STRING("Arrowheads")); LOGICAL_DATA(ans)[DOPT_EDGES_D] = options->edges_directed_show_p; SET_STRING_ELT(names, DOPT_EDGES_D, COPY_TO_USER_STRING("Directed edges")); LOGICAL_DATA(ans)[DOPT_WHISKERS] = options->whiskers_show_p; SET_STRING_ELT(names, DOPT_WHISKERS, COPY_TO_USER_STRING("Show whiskers")); /* unused LOGICAL_DATA(ans)[5] = options->missings_show_p; SET_STRING_ELT(names, 5, COPY_TO_USER_STRING("Missing Values")); LOGICAL_DATA(ans)[8] = options->axes_center_p; SET_STRING_ELT(names, 8, COPY_TO_USER_STRING("Center axes")); LOGICAL_DATA(ans)[9] = options->double_buffer_p; SET_STRING_ELT(names, 9, COPY_TO_USER_STRING("Double buffer")); LOGICAL_DATA(ans)[10] = options->link_p; SET_STRING_ELT(names, 10, COPY_TO_USER_STRING("Link")); */ SET_NAMES(ans, names); UNPROTECT(2); return(ans); } /* */ USER_OBJECT_ RS_GGOBI(setDisplayOptions)(USER_OBJECT_ which, USER_OBJECT_ values) { gint i; DisplayOptions *options; displayd *display = NULL; int apply = 0; g_return_val_if_fail(GET_LENGTH(values) == 8, NULL_USER_OBJECT); if(GET_LENGTH(which) == 0) { options = GGOBI(getDefaultDisplayOptions)(); } else { display = toDisplay(which); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); options = &(display->options); g_return_val_if_fail(options != NULL, NULL_USER_OBJECT); apply = 1; } i = 0; options->points_show_p = LOGICAL_DATA(values)[i++]; options->axes_show_p = LOGICAL_DATA(values)[i++]; options->axes_label_p = LOGICAL_DATA(values)[i++]; options->axes_values_p = LOGICAL_DATA(values)[i++]; options->edges_undirected_show_p = LOGICAL_DATA(values)[i++]; options->edges_arrowheads_show_p = LOGICAL_DATA(values)[i++]; options->edges_directed_show_p = LOGICAL_DATA(values)[i++]; options->whiskers_show_p = LOGICAL_DATA(values)[i++]; /* unused options->missings_show_p = LOGICAL_DATA(values)[i++]; options->axes_center_p = LOGICAL_DATA(values)[i++]; options->double_buffer_p = LOGICAL_DATA(values)[i++]; options->link_p = LOGICAL_DATA(values)[i++]; */ if(apply) { set_display_options(display, display->ggobi); } return (NULL_USER_OBJECT); } static void toggle_display_variables(displayd *display, USER_OBJECT_ vars, gboolean active) { gint i, j; for (j = 0; j < 3; j++) { USER_OBJECT_ varIds = VECTOR_ELT(vars, j); for (i = 0; i < GET_LENGTH(varIds); i++) { gint var = INTEGER_DATA(varIds)[i]; GtkWidget *wid = varpanel_widget_get_nth(j, var, display->d); if (!GTK_IS_WIDGET(wid)) error("Unknown variable"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)) == active) { varsel(wid, &display->cpanel, display->current_splot, var, j, -1, 0, 0, 0, display->d, display->ggobi); } } } } USER_OBJECT_ RS_GGOBI(getDisplayVariables)(USER_OBJECT_ dpy) { USER_OBJECT_ buttons, vars, ans; static gchar *button_names[] = { "X", "Y", "Z" }; gint i; displayd *display = toDisplay(dpy); /* get the currently plotted variables */ gint *plotted_vars = g_new (gint, display->d->ncols); gint nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->plotted_vars_get( display, plotted_vars, display->d, display->ggobi); PROTECT(ans = NEW_LIST(2)); buttons = NEW_CHARACTER(nplotted_vars); SET_VECTOR_ELT(ans, 1, buttons); vars = NEW_INTEGER(nplotted_vars); SET_VECTOR_ELT(ans, 0, vars); for (i = 0; i < nplotted_vars; i++) { gint var = plotted_vars[i], j; for (j = 0; j < G_N_ELEMENTS(button_names); j++) { GtkWidget *wid = varpanel_widget_get_nth(j, var, display->d); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid))) SET_STRING_ELT(buttons, i, mkChar(button_names[j])); } INTEGER_DATA(vars)[i] = var; } UNPROTECT(1); g_free(plotted_vars); return(ans); } /* Allows the R user to set the variables within a given display */ USER_OBJECT_ RS_GGOBI(setDisplayVariables)(USER_OBJECT_ vars, USER_OBJECT_ varPrev, USER_OBJECT_ dpy) { displayd *display, *prev_display; USER_OBJECT_ ans = NULL_USER_OBJECT; display = toDisplay(dpy); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); /* ensure that display is current before changing variables */ prev_display = display->ggobi->current_display; display_set_current(display, display->ggobi); /* If any of the requested variables AREN'T selected, select them */ toggle_display_variables(display, vars, false); varpanel_refresh(display, display->ggobi); /* If any of the obsolete variables ARE still selected, select (toggle) them */ toggle_display_variables(display, varPrev, true); /* refresh everything */ varpanel_refresh(display, display->ggobi); display_tailpipe(display, FULL, display->ggobi); while(gtk_events_pending()) /* ensure display is redrawn */ gtk_main_iteration(); /* revert to previously selected display */ display_set_current(prev_display, prev_display->ggobi); return(ans); } USER_OBJECT_ RS_GGOBI(getDisplayDataset)(USER_OBJECT_ dpy) { displayd * display; USER_OBJECT_ ans; display = toDisplay(dpy); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); ans = RS_datasetInstance(display->d); return(ans); } USER_OBJECT_ RS_axesValueMatrix(displayd *display) { /* currently only works for Tour2D */ int n = display->t2d.nsubset, k, j; vartabled *vt; USER_OBJECT_ matrix; PROTECT(matrix = allocMatrix(REALSXP, n, 4)); for (k = 0; k < n; k++) { j = display->t2d.subset_vars.els[k]; vt = vartable_element_get (j, display->d); REAL(matrix)[k] = display->t2d.F.vals[0][j]; /* x coeff */ REAL(matrix)[k+n] = display->t2d.F.vals[1][j]; /* y coeff */ REAL(matrix)[k+2*n] = vt->lim.max - vt->lim.min; /* range */ REAL(matrix)[k+3*n] = j+1; /* variable index */ } UNPROTECT(1); return(matrix); } void RS_INTERNAL_GGOBI(getTourVectorsFromMode)(displayd *display, ProjectionMode mode, gdouble **x, gdouble **y) { tour *t; switch(mode) { case TOUR1D: t = &display->t1d; break; case TOUR2D: t = &display->t2d; break; case TOUR2D3: t = &display->t2d3; break; case COTOUR: t = &display->tcorr1; break; default: g_critical("Specified mode '%s' is not a tour", GGOBI(getPModeName)(mode)); return; } *x = t->F.vals[0]; *y = NULL; if (mode == COTOUR) *y = display->tcorr2.F.vals[0]; else if (mode != TOUR1D) *y = t->F.vals[1]; } /* Expects a 2 column matrix with the X and Y coefficients for each var */ USER_OBJECT_ RS_GGOBI(setTourProjection)(USER_OBJECT_ s_display, USER_OBJECT_ s_mode_name, USER_OBJECT_ matrix) { displayd *display = toDisplay(s_display); ProjectionMode mode = GGOBI(getPModeId)(asCString(s_mode_name)); gint k, n; gdouble *x = NULL, *y = NULL; g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getTourVectorsFromMode)(display, mode, &x, &y); g_return_val_if_fail(x != NULL, NULL_USER_OBJECT); n = display->d->ncols; for (k = 0; k < n; k++) { x[k] = REAL(matrix)[k]; if (y) y[k] = REAL(matrix)[k+n]; } display_tailpipe (display, FULL, display->ggobi); varcircles_refresh (display->d, display->ggobi); return NULL_USER_OBJECT; } USER_OBJECT_ RS_GGOBI(getTourProjection)(USER_OBJECT_ s_display, USER_OBJECT_ s_mode_name) { displayd *display = toDisplay(s_display); ProjectionMode mode = GGOBI(getPModeId)(asCString(s_mode_name)); gint k, n; USER_OBJECT_ matrix; gdouble *x = NULL, *y = NULL; g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getTourVectorsFromMode)(display, mode, &x, &y); g_return_val_if_fail(x != NULL, NULL_USER_OBJECT); n = display->d->ncols; PROTECT(matrix = allocMatrix(REALSXP, n, 3)); for (k = 0; k < n; k++) { vartabled *vt = vartable_element_get (k, display->d); REAL(matrix)[k] = x[k]; /* x coeff */ if (y) REAL(matrix)[k+n] = y[k]; /* y coeff */ else REAL(matrix)[k+n] = 0; REAL(matrix)[k+2*n] = vt->lim.max - vt->lim.min; /* range */ } UNPROTECT(1); return matrix; } USER_OBJECT_ RS_GGOBI(getDisplayWidget)(USER_OBJECT_ r_display) { displayd *display = (displayd *) toDisplay(r_display); GtkWidget *widget = GTK_WIDGET(display); if (GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) widget = gtk_bin_get_child(GTK_BIN(GGOBI_WINDOW_DISPLAY(display)->window)); return toRPointer(widget, "GtkWidget"); } USER_OBJECT_ RS_displayInstance(displayd *display) { USER_OBJECT_ ans; ans = toRPointer(display, "GGobiDisplay"); return(ans); } USER_OBJECT_ RS_GGOBI(closeDisplay)(USER_OBJECT_ ref, USER_OBJECT_ ggobiId) { ggobid *gg = toGGobi(ggobiId); USER_OBJECT_ ans = NEW_LOGICAL(1); displayd *display; g_return_val_if_fail(GGOBI_IS_GGOBI(gg), NULL_USER_OBJECT); if(!gg) return(ans); display = (displayd *) R_ExternalPtrAddr(ref); display = ValidateDisplayRef(display, gg, false); if(display) { display_free(display, true, gg); LOGICAL_DATA(ans)[0] = TRUE; gdk_flush(); } return(ans); } displayd * toDisplay(USER_OBJECT_ rdisplay) { if(inherits(rdisplay, "GGobiDisplay")) { displayd *display = getPtrValue(rdisplay); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL); g_return_val_if_fail(ValidateGGobiRef(display->ggobi, false) != NULL, NULL); return(ValidateDisplayRef(display, display->ggobi, false)); } g_critical("An R GGobi display object must inherit from class 'GGobiDisplay'"); return(NULL); } rggobi/src/plot.c0000644000175100001440000000635112761555755013501 0ustar hornikusers#include "RSGGobi.h" #include "RUtils.h" #include #include "vars.h" #include "parcoordsClass.h" #include "scatmatClass.h" #include "scatterplotClass.h" #include "tsdisplay.h" #include "barchartDisplay.h" greal RS_INTERNAL_GGOBI(tformToWorld)(GGobiData *d, gint j, greal min, greal max) { vartabled *var = vartable_element_get(j, d); gdouble var_min = var->lim.min, var_max = var->lim.max; gdouble mid = (max - min) / 2.0 + min; greal ftmp; ftmp = -1.0 + 2.0 * ((greal) mid - var_min) / (var_max - var_min); return (greal) (PRECISION1 * ftmp); } void RS_INTERNAL_GGOBI(getPlotRange)(displayd *display, splotd *sp, fcoords *tfmin, fcoords *tfmax) { icoords scr; cpaneld *cpanel; cpanel = &display->cpanel; if (display->hrule == NULL) return; tfmin->x = tfmin->y = tfmax->x = tfmax->y = 0.0; scr.x = scr.y = 0; GGOBI_EXTENDED_SPLOT_GET_CLASS (sp)->screen_to_tform (cpanel, sp, &scr, tfmin, display->ggobi); scr.x = sp->max.x; scr.y = sp->max.y; GGOBI_EXTENDED_SPLOT_GET_CLASS (sp)->screen_to_tform (cpanel, sp, &scr, tfmax, display->ggobi); } USER_OBJECT_ RS_GGOBI(setPlotRange)(USER_OBJECT_ s_min_x, USER_OBJECT_ s_min_y, USER_OBJECT_ s_max_x, USER_OBJECT_ s_max_y, USER_OBJECT_ rdisplay, USER_OBJECT_ plot) { displayd *display; USER_OBJECT_ ans; fcoords tfmin, tfmax; splotd *sp; greal min_x = NUMERIC_DATA(s_min_x)[0], min_y = NUMERIC_DATA(s_min_y)[0]; greal max_x = NUMERIC_DATA(s_max_x)[0], max_y = NUMERIC_DATA(s_max_y)[0]; greal scale_x, scale_y; display = toDisplay(rdisplay); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); g_return_val_if_fail(pmode_get(display, display->ggobi) == XYPLOT, NULL_USER_OBJECT); sp = GGOBI(getPlot)(display, INTEGER_DATA(plot)[0]-1); g_return_val_if_fail(GGOBI_IS_SPLOT(sp), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getPlotRange)(display, sp, &tfmin, &tfmax); sp->pmid.x = RS_INTERNAL_GGOBI(tformToWorld)(display->d, sp->xyvars.x, min_x, max_x); sp->pmid.y = RS_INTERNAL_GGOBI(tformToWorld)(display->d, sp->xyvars.y, min_y, max_y); scale_x = sp->scale.x * (max_x - min_x) / (tfmax.x - tfmin.x); scale_y = sp->scale.y * (max_y - min_y) / (tfmax.y - tfmin.y); splot_zoom(sp, scale_x, scale_y); ans = NEW_LOGICAL(1); LOGICAL_DATA(ans)[0] = TRUE; return(ans); } USER_OBJECT_ RS_GGOBI(getPlotRange)(USER_OBJECT_ rdisplay, USER_OBJECT_ plot) { /* This returns a list of two vectors, one for the X min/max and one for the Y */ displayd *display; splotd *sp; USER_OBJECT_ ans, s_x, s_y; fcoords tfmin, tfmax; display = toDisplay(rdisplay); g_return_val_if_fail(GGOBI_IS_DISPLAY(display), NULL_USER_OBJECT); g_return_val_if_fail(pmode_get(display, display->ggobi) == XYPLOT, NULL_USER_OBJECT); sp = GGOBI(getPlot)(display, INTEGER_DATA(plot)[0]-1); g_return_val_if_fail(GGOBI_IS_SPLOT(sp), NULL_USER_OBJECT); RS_INTERNAL_GGOBI(getPlotRange)(display, sp, &tfmin, &tfmax); PROTECT(ans = NEW_LIST(2)); s_x = NEW_NUMERIC(2); SET_VECTOR_ELT(ans, 0, s_x); s_y = NEW_NUMERIC(2); SET_VECTOR_ELT(ans, 1, s_y); NUMERIC_DATA(s_x)[0] = tfmin.x; NUMERIC_DATA(s_x)[1] = tfmax.x; NUMERIC_DATA(s_y)[0] = tfmax.y; NUMERIC_DATA(s_y)[1] = tfmin.y; UNPROTECT(1); return ans; } rggobi/src/longitudinal.c0000644000175100001440000000074012761555755015210 0ustar hornikusers#include "RSGGobi.h" USER_OBJECT_ RS_GGOBI(setAsTimeVariables)(USER_OBJECT_ vars, USER_OBJECT_ values, USER_OBJECT_ datasetId) { gint i, which; ggobid *gg; GGobiData *d; int num; USER_OBJECT_ ans; d = toData(datasetId); g_return_val_if_fail(GGOBI_IS_DATA(d), NULL_USER_OBJECT); gg = d->gg; num = GET_LENGTH(vars); PROTECT(ans = NEW_LOGICAL(num)); for (i = 0; i < num; i++) { which = INTEGER_DATA(vars)[i]; } UNPROTECT(1); return(ans); } rggobi/src/smooth.c0000644000175100001440000000603612761555755014034 0ustar hornikusers/* Provides a mechanism for invoking an R-level function for performing the smoothing of a pair of variables and returning a single vector of numbers for the smoothed y. The function can be specified programmatically, allowing the user to experiment with different implementations. The function is called with thre arguments - x, y and window width and is expected to return a Numeric vector with the same length as each of x and y. */ #include "RSGGobi.h" #include "RSEval.h" #include #include "vars.h" USER_OBJECT_ RS_smoothFunction = NULL; USER_OBJECT_ RS_GGOBI(variableToRS)(int index, ggobid *gg); /** Computes the smoothed values for the y variable for the bivariate X and Y identified by column index for the data set in ggobi. This calls the R/S function currently registered in the variable RS_smoothFunction with three arguments: the numeric vectors x & y the desired window width as specified by the the argument `width'. */ double * RS_GGOBI(smooth)(int x_index, int y_index, double width, ggobid *gg) { double *values; USER_OBJECT_ vals, tmp; USER_OBJECT_ e; if(RS_smoothFunction == NULL || RS_smoothFunction == R_UnboundValue) return(NULL); e = allocVector(LANGSXP, 4); PROTECT(e); SETCAR(e, RS_smoothFunction); SETCAR(CDR(e), RS_GGOBI(variableToRS)(x_index, gg)); SETCAR(CDR(CDR(e)), RS_GGOBI(variableToRS)(y_index, gg)); tmp = NEW_NUMERIC(1); NUMERIC_DATA(tmp)[0] = width; SETCAR(CDR(CDR(CDR(e))), tmp); vals = eval(e, R_GlobalEnv); PROTECT(vals); /* PrintValue(vals); */ values = asCArray(vals, double, asCNumeric); UNPROTECT(2); return(values); } /* Creates Note that we could use the conversion used by the .C() routine to convert the objects in both directions. */ USER_OBJECT_ RS_GGOBI(variableToRS)(gint index, ggobid *gg) { GGobiData *d = NULL; gint n, i; USER_OBJECT_ obj; if (g_slist_length (gg->d) == 1) d = (GGobiData *) g_slist_nth_data (gg->d, 0); else return(NULL_USER_OBJECT); n = d->nrows; PROTECT(obj = NEW_NUMERIC(n)); for(i = 0 ; i < n ; i++) { NUMERIC_DATA(obj)[i] = d->raw.vals[index][i]; } UNPROTECT(1); return (obj); } USER_OBJECT_ RS_GGOBI(getSmoothFunction)() { USER_OBJECT_ ans; if(RS_smoothFunction == NULL) ans = NULL_USER_OBJECT; else ans = RS_smoothFunction; return(ans); } USER_OBJECT_ RS_GGOBI(setSmoothFunction)(USER_OBJECT_ func) { USER_OBJECT_ old; old = RS_smoothFunction; if(old != NULL) R_ReleaseObject(RS_smoothFunction); else old = NULL_USER_OBJECT; RS_smoothFunction = func; R_PreserveObject(RS_smoothFunction); return(old); } /* Replaces the smoother callback in Ggobi that is invoked when the user drags the window width slider. Because of the way we link R.so with libGGobi.so, we get to slide this ahead of the other one rather than having to register different callbacks, etc. */ void width_cb (GtkAdjustment *adj, ggobid *gg) { RS_GGOBI(smooth)(0,1, adj->value, gg); } rggobi/NAMESPACE0000644000175100001440000000335712761400704012771 0ustar hornikusersexportPattern("^[^\\.]") import(utils) import(RGtk2) useDynLib(rggobi) S3method(print, GGobiData) S3method(dim, GGobiData) S3method(nrow, GGobiData) S3method(ncol, GGobiData) S3method(names, GGobiData) S3method("names<-", GGobiData) S3method(rownames, GGobiData) S3method("rownames<-", GGobiData) S3method(dimnames, GGobiData) S3method("dimnames<-", GGobiData) S3method(summary, GGobiData) S3method("[", GGobiData) S3method("$", GGobiData) S3method(as.data.frame, GGobiData) S3method("[<-", GGobiData) S3method("$<-", GGobiData) S3method(as.matrix, GGobiData) S3method("[", GGobi) S3method("[[", GGobi) S3method("$", GGobi) S3method(print, GGobi) S3method(names, GGobi) S3method(summary, GGobi) S3method(close, GGobi) S3method(print, GGobiDisplay) S3method(close, GGobiDisplay) S3method(length, GGobiDisplay) S3method(`edges<-`, GGobiDisplay) S3method("displays", GGobi) S3method("edges<-", GGobi) S3method("edges<-", GGobiData) S3method("pmodes", default) S3method("pmodes", GGobiDisplay) S3method("pmodes", character) S3method("imodes", GGobiDisplay) S3method("imodes", character) S3method("display", GGobiData) S3method("variables", GGobiDisplay) S3method("variables<-", GGobiDisplay) S3method("ggobi", GGobiDisplay) S3method("ggobi", default) S3method("glyph_type", GGobiData) S3method("glyph_type<-", GGobiData) S3method("glyph_size", GGobiData) S3method("glyph_size<-", GGobiData) S3method("glyph_colour", GGobiData) S3method("glyph_colour<-", GGobiData) S3method("excluded", GGobiData) S3method("excluded<-", GGobiData) S3method("selected", GGobiData) S3method("shadowed", GGobiData) S3method("shadowed<-", GGobiData) S3method("ids", GGobiData) S3method("ids<-", GGobiData) S3method(dataset, GGobiDisplay) S3method(dataset, character) S3method(dataset, numeric) rggobi/demo/0000755000175100001440000000000012325763563012501 5ustar hornikusersrggobi/demo/ball.R0000644000175100001440000000404312325763563013537 0ustar hornikuserslibrary(rggobi) library(RGtk2) pong <- function() { x <- 100 lives <- 3 deaths <- 0 box <- as.data.frame(rbind(cbind(1:x, 0), cbind(1:x, x), cbind(x, 1:x), cbind(0, 1:x), c(x/2, x/2), cbind(-20, seq(1,lives*4, by=4)))) box <- cbind(box, 0) # Unfortunately, lives cannot be a variable since ggobi_data_set_variables # can't handle categorical data #calc_lives <- function() { # life_fact <- as.factor(c(rep("Lives", lives - deaths), rep("Deaths", deaths), # rep(NA, 4*x - lives - deaths + 1))) # levels(life_fact) <- c("Lives", "Deaths") # life_fact #} #life <- calc_lives() #box <- cbind(box, life) colnames(box) <- c("X", "Y", "Z") gg <- ggobi(box) d <- gg[1] glyph_color(d) <- c(rep(c(1,1,1,8), x), rep(3, lives+1)) shadowed(d) <- c(rep(FALSE, 3*x), rep(TRUE, x), FALSE, rep(FALSE, lives)) v <- c(.7, 1) b <- nrow(d) - lives blocked <- FALSE update_cb <- function() { if (blocked) return(TRUE) ball <- d[b,c(1,2)] if (ball[1] >= x) v[1] <<- -v[1] if (ball[2] <= 0 || ball[2] >= x) v[2] <<- -v[2] if (ball[1] <= 0) { box[b,c(1,2)] <- c(x/2,x/2) v <<- c(.7, 1) blocked <<- TRUE if (lives > deaths) { dialog <- gtkMessageDialog(NULL, 0, "info", "ok", "Sorry, you missed:", lives-deaths, "lives left") dialog$run() } else { dialog <- gtkMessageDialog(NULL, 0, "question", "yes-no", "Sorry, game over: play again?") if (dialog$run() == GtkResponseType["yes"]) pong() } dialog$destroy() blocked <<- FALSE if (deaths == lives) return(FALSE); deaths <<- deaths + 1 shadowed(d) <- c(rep(FALSE, 3*x), rep(TRUE, x), FALSE, rep(FALSE, lives - deaths), rep(TRUE, deaths)) #ggobi_data_set_variables(d, calc_lives(), "Lives") } else box[b,c(1,2)] <- ball + v d[,"X"] <- box[,1] d[,"Y"] <- box[,2] return(TRUE) } class(gg) <- "GObject" gSignalConnect(gg, "identify-point", function(gg, plot, id, data) { if ((id+1) == b && v[1] < 0) v <<- v*c(-1,1) }) gTimeoutAdd(2, update_cb) } pong() rggobi/demo/00Index0000644000175100001440000000006012325763563013627 0ustar hornikusersball A pong game written with rggobi and RGtk2 rggobi/CHANGELOG0000644000175100001440000000023212325763563012764 0ustar hornikusers 2.1.4-5 --------- * ggobi_longitudinal now creates a separate dataset for the edges * fixed variables() indexing problems and added more examples. * rggobi/NEWS0000644000175100001440000000035012761401174012241 0ustar hornikusersVersion 2.1.21 -------------- * Fix outstanding R CMD check errors. Version 2.1.20 -------------- * Fix outstanding R CMD check errors. Version 2.1.17 -------------- * Updated windows makefile to work with new version of ggobi rggobi/data/0000755000175100001440000000000012325763563012466 5ustar hornikusersrggobi/data/stormtracks.rda0000644000175100001440000015330312325763563015537 0ustar hornikusers‹ì½ ´eGyß¹m„[~;‰‡È6ƒÝ­Vw«Õ’ZýR‹yX 4¡ÇĨ…Çš5YK“µBÖ¬¥ÉšŒg&£¼†É$J;C’vœø1æÄÆ6ÌË `@`˜glÅŽÌdænÎï÷?uªö¾÷öãö=·uz­êºµwíª¯¾W}õÕWuî:ví7û¦®ë¾±ûÆËVþÚÊŸ—}ãÊßÐußþ¬•ü›Oßï}o¹ÿ¾ãoø‘Ó]÷´g¯<ºb%ÿ–®û®w®üý´HÏÜ€ôí[ ýé Hß{ÓÕËÔ¤®3½r ¤–©Û¹AiÏ&¦ÃËôõtç2u:¾Ó0ý…óL?r‰¦S0Ý» 锞u‰¤o»é»78=g™ÖL?°L£iÛ&¤ë/±ôÚH»¶hÚ?’îx ¥#—hzúLW¬#}çy¦?µÓ÷,SÒ÷_€tí9¤o¼Hé[¶pú޳Lò¥?·é7 ýÐS<½âÓöK;.Ñ´÷"¥ƒþÓe:«t÷¥Ë/RúÖ‹”ž} ¥?ûOþ¥çoñôâK ½ì,Ó«6)ݸÉißy¦Û8}Ã2mXú¦u¤?±ŽtåNß·Îô¼MH/¹Èéå[$½úK7]ätË&§)ݵAé?;‡´Ùq®™6"†v‘âi7"Vv‘bi)mv íFÇÞnfÚʱ»u ëXº±ª‡Î3½nÒñ³LoØÂiÑãÞ¾ëÒV‹7{ÏôÒóH›7´Y±Hcq?ËtaÒfÇ4]èt!c‰.tºâ§ócº˜i³ãŸ6*^êBÄ-Z:Û¸¦ë6 ½æ)vo@ºù)’nÝé?9ÇôÃËt^éõ”Þ|é/BÚìØÍŒó<Ÿt¡bD/vÚ¬˜Ñ­œ^tӹƖ.jŒé¥”.dŒêVL+®v£ÒFÄë.J:v–éî5Ò›8]¶Î´Qñ·}úæ ”1ööÏl‘´Ù1µ[!^÷b¤«¶PzÁ‚¦k mDìñ¢¤ÍŠÞÌXëó>ŸtÛEJG/¡ôŸoB:±LséäENÿÅ‚¤·œgºgôÖsLÿåL÷-Vš»æöòS'~ôÄ©ÓÝ4Z´¯Ñ?}ÆŽS¯?qßý÷R¼lÇ©?6{uêäé{ï¡øô§Þúæãž¶ãÿ¼|Ç}§NÜsbVºÿÍo³õ§ï<~ß}øjçJGiáé+¥NÙíÎ÷Ïß'OÊ'÷ÞsÏÉys߉ûýüƧg7¾ùø=÷?UW`z Uß|ßÉÓ)œ¼ç¾yÖ§Ž¿í'î¿ÿD¬Ô¼ÿÞ×§©gî:¾Òÿ©SVxúJù?¿l׉ãÁή¯ý³Â©Œçò]'VÆþwÝ{êT¸iN¾é÷¾íø}o´ÞMo9™zϸ魧OžšQâ¦ûNþHеR¸'õî»çÄéóòÝÇ_2>m÷ñÀ·ûÄ©“’ù™»OÝ{߉{Þ!®”ŒËvß—žÑÿý†§óÝJñGN¥ógí9þúûæpµçø[Þ,ì9¾XšÚsâÞûþBšºlÏ g¤â½÷½q6Ô=÷d—ïyÛéûÿ¨¯ö®"Íï=~߆â—ï=Q°äÓ÷ž¸ç¾“ö¼÷Ä}o9™wÏÜ{ï}÷Ÿ¸çô¬ü¶·”òðô›ï›5tÙÍÝ|úøñ7ØßJáõ'BÉ›OŸ|ã JóÕ…—ï[á˜`ûN̤ã²}÷Šgõ¿õÍ'‹š÷>4\¶ïm3¶»åø €¾¸eÆN+‡«Ÿ±ò÷ “Dòn9qòþ7§Þ3‚í/¤õiûOÌžŸ˜1ýåûOœ>5Éý'Oœý}Ú>ž±¿ç©ÿ:jeÿÛf˜»õø}o¸·(œÌG}áÔ÷ÌŠ÷ßÿæÿUŠ'ßðæãÁò3ûbÉm·‚½R¸ÿ ñòÛŽ¿q†ÊËn›!æ™·­´qï©ã§Sóäî=5«yoz»üöRM\vû©¿ù»ý­3Åsû[W@:9{uÿŒ‘ý©YáÄý'T^Ï<ðæ¾õ­iüàÉèŽg¼÷Ç †yÖ¡¯_£“3ŠºÆ ‡WÄíYážBð£' ñ¾óä©Håe¯ûºÞ›'žþ†„8M|ƒãÓñ7Üoòì¾¾åÖ_þŒ÷,Ó2-Ó2-Ó2-Ó2-Ó2-Ó9§G—i™–i™–i™–i™.pzï2-ÓS ½o™–i™–i™–i™65½™–i™–i™–iƒÓo.Ó2-Ó2-Ó2]àôeZ¦eZ¦eZ¦eÚôÁeZ¦eZ¦eZøô¡eZ¦eZ¦eZ¦eZ¦I^¦eZ¦eZ¦eZ¦ezФ,Ó2-Ó2-Ó2-Ó2-Ó2-Ó2m‘ô[7y‡í†þTÔzÓ3–iÝé™k¤³­¿LË4”žµ0¬ÛÅJ›=ÖÀÍV¤Ã2mNú¦*mD›¶ŒË´øé›×‘–6òæÛÀË´ñóÂfo‘m§â˜·jÚì9e™6o®ÞŠiil|Úl´Hi³äwi+.~ÚlÞ\¦ 'ãß¼p<ÒùèÄ­ãVM›m×mvºb•t±ö7{>[¦­g\*ãX¦³O›=gl¥´ÙóËzÓfë³eºøi³õÈ2]:é\õãņg#DzLÃi³ã\—k§­•6[—-Ó2kÚl]»•Òf¯y)­æ\Oz*Çzm¶Ì/Ó2-zÚl]>i³qw¡ñyÙ§elôÖIOå9v«À¹L'möµU×D›=Þ§JºÐë½H[mÝ·LË4”6{.Z+]Ìq^ê¸\¦eZ¦õ§E±6Û_^¦õŽa#÷‘/žÑW³Ù{+ëM›íÏY¦µùe³×H½ïv1p¸Hò´Ùk…eº´ÓfÛ[Ë´LOÅ´ÙþÖK)­eƒ|ÃENÞaû´*Õ{ÉO¯ÒZk’µt÷Кr#Ú¯ñû-UúÖ*}[•¾½JßQ¥?Q¥gWé;«ô]Uú“+é»WÒŸ«Òsªôç«TÓñ«t¶õχþçBëÕÖ‹H£2ý©*ýé*]yã>—¶Ëôgªôg«ôÝU:>[dØ6Чk³QãßLÜlE:œëܲ–ßáRÐ9){57¢Íæ›E„ñ|ù#äadáBÊÅfèÖÒ›­+/o\µÑút+êé‹=7?UÆy.rµc^Të\õÆfÙ7%ïlUüµõT²i/U{þBÚ§gÃwçŠÏ­‚×’ŸyÍz±mô 1æsíbÙ‹Àoç:ÎÍ‚o‘m¯ó‘%ÛÙʺë\xé› ß¹ŽoÑÆ¿È¸>™¹X0o„\.}¹H|y1í‹¡KM_ï>ÕåæB}«Ûê‹ÃùÊÒÙ¶³YcÜlð|åt‘ù`+¬wkñÎz`ß ×;wl­.6‡L‹j«=r±áÙì„‹¥[7ŠŸÏ…Ï/åùc£ííE˜ç.¶~Y?ÀfðڢµomÛíbÍ›ÁëýæBòÁùú)Á‡q®±5[É~2]h™ºÐ<|.ßo´/ìBóÜFÍ;s.8½±¶Ê…Öçës+ø®7Û_|>¼{©ás‘yþBã`+ØÝ¦­¦£Ö;¾Ka¿©æ“³…s#`ÚŠk̳åëЧ‹¦7j~Û ã8W¾[´õý¢Ùké¥â»óÑ;CÏ/¢}9Æãª­õÈÈV•£õÀ¼Ù²¶sA™.æ8Ï·ŸEÀ×"ÚEB†¶¬1onõq- a_ž­l®%³‹lﯗ6©«.Ô<8Vo3õö"Éìjø¼”ç²­4‡.Òúx-ú.ßéE°+Ö3ö­j_.*\Šæ‹ÄËþêŸëZpQôÊ…à…Í€c³Ç¼Ù:¯ž.özfQÖMJŽÆxø\ùh+®©Íßµ"k_¿Ã¶ãýàéR)/ «•Žs-/,‹R^o½E€u­ò"Ár©•Ÿª}/Ry`ØjåE€áR€y`XÄò…lk3àߨv7c,Q¾mmU^JåEcË›Ñç"Y^Ì9t‘`\ÊÃÖл[ Þ Q^8¡¼Y<{©ÊÓ¥P^6¢üm ÇÅ.ÂÁs¾åE‚åB–†s-/ Ëòb——¼xöåE‚e©ë—sÃù”Ïö»Í‚y³ñ´UËÝ:ê/ ¬—by=uYwmî6›f‹Z^8¶jy³aÙê|²ÈcÞŒò’_—å U^8.E¸·r?ëýf‘Ʊ4?Ûò"Ár¶åE€áB—/õ¹u½å‹Ù×"Œw‘Ê‹Dz|é” –ºüTÖ'‹ÃFÌ_‹óféåE€y+– –­V^8V+?ôú"–žKG. þ×S¾mõw©|Ç:ê-Ò¸/¿=UËË9hY¾Xúv‘Ë‹ÇR¶Î¿¼(pœKyæºæÉÍÆñV(/ U^8.µya`*/ [Oõ¹`ØŒò¢Àq!Ê›ÑïfyÑÊËyþÜʋò<\þÖþÛí/yÓ×ÿm¿vÿ£+ÿÞ»}ùKîÿýí/Ÿ~¸ý:ž¿â̶þßöWn›æ¯¢Þ N뽚òk¨÷ÚG§ßm¿kú|;åÛ§õwPÞùÐ4¿‘ç7>1…kíÞD7ñ|7ýì¡þÞ+¦ßß ¼ûøn?ùm<¿ü€9ßoïæó×Òð¿ÖñÐÞkÁGràÙ~%9å´·ãôôûON󼿼쎛®f|ä{÷^Þ¿„ö_×R¾ø¶Qí¿”÷ÒóeWŽäŒãeŒ÷å”_N»×Ñîu”_Aÿ×S/ü@~ù«yÿñ&žx~ ¼ƒöwWø‚ò“i;»x~íîæ»=Mëí%¿™çòÃ-äÂûJÚMÙñX>ŸSÿʯ†¾¯¦þk(g¼VüõàÙ塃ò¾Bž¿‚z× ·ãþ3ótþhO:½šòkxÿZôÃvø1|¼íà}èF½ÐéFú“Ïo¤þ içÊ/??dÎóS~1í¼˜ï^ÂóÈåkÕgŒ;rÀsùüåÐñåÔkðÈûëyÿJÞ¿ŠvÂßÒŸzÑ{êžÃ۷÷ÛÁOôÃþ Ÿ«Á÷NÚÙI=å#9zfçþùïv Òiõw€¿<²úžïn¤Þ.žß»É÷Ï^êÝLyãÜÏ8o5ç¹z¹Éy¯¾irú¹:]×Ueà”®×A‡®ȇä×@ÏkäKð._¾ˆ÷/’_©÷"ê…_éÿÅÀùê] ¼Û¨÷RÚ^æùËéG¾|…|ÈûW’¿Šç‘kžê#åY½+ŸÉ¼ßI9zy¾‘ò.Þ‹Çä»à“÷׈7óJ΃gñÎsõ‚tyaÕnC¯ŠN?¤ž ž Þµ´:ÔzúêÛð“eÚyõ^A?·ÚG¯€~×Sïz꩟¯§½ë©ÿJêEϨ—¯œ§ÛÊÊùÔßE»7A§Ý”÷PÞ‹þÝËw{iO»b/tÞ Ééo/ðç{ô“ò(gø”v^E5¿fþ‘oÕ«ÎCÔkô*ï1xfóæ„üoGŸY޼VüòCà1òK?/¦]çÓŽvóK”sùëÊJÞégýÈw™—xÿRú“_J{/{x~žzeù$rÏû׊ /WSÿjž_M¿Ï¥Ÿ<§ü<ÊÏã»çÓÏ(÷µà»Zdž§½èé ^•[ñÍûȯò ž’K‡ú9tÈ÷uî{ëÓï¨!]øî¥Ð½Ñêž_OYyЮTG¾ùÞu’ë£äÚQ»¿›àkåûfø^ûÖuOæ[ÊίÏéû<à|>ýü€ô%ô¬ôxèWÓMº€¿FÀ_ô/ýò;eõ¨özÖòÿÃ+}¹ƒöv¢·2¯×>®‡ëЛ¶“÷~;mzh?iOigE/=8çvà~-ð¾Fy®žGÿñ}Ö¥êCê¥]øE»=ë-ÚݻӜïcŸšË§~<Ú~ÿýô=SóõÃ_ä±hÿ‡×Çñ[ÐN-§ò×6¾ÛÆûè[å˜ö^Êû—Q~9íhg:¯g¾&oüäÎ[Í:@úÔzz;üPçà¹ñ'ÐöÚ6ÚÍøÍé?¹Ï•GÚO£þå”v|.Þœ¯Ô‹™¿€Où~ïcçR/x&wݥݠ}ùÊ#øŠ…z7Á‡®S®â»«è÷{)?ãs|ß?ßœ÷Ïç;õ£ó¡|ü•þ|¾ó'Ï;–÷ѧ<Ÿ;ïf^â}èZó¹üa}åBú×¹ô«ä#t”ÀCèè<(Hë ãCýÆþyxž¿Â?¶/\kÀ¡>w\´÷Ò /Ð~qž£¾ë:ç3ñ8…«n_úÔòJ=×'úcµGbgÒŽv`ã«æÇØÝ–ù¾ž7ã¯ÚVÍ'Î#‘ÿZþºÔÓ°ÓzΣô»ë‰yùÜ3™æ7S~%pdÝÀw¯¦œu-ð×~*íÿÌW´¿“qÆ_‚žHn=à‹~»è/~ž_­Ox®‰ýLÿ‚ñf[ëùrìUù±’«ø¨?寝 ¨w#~ðžu†ópg^ßÚY»¨wÓÓz»É÷Ðî¾Ëº“òÍä·ð|?t¹¼ëGº:ÅÄûÚ¾­íÜègŸ›×ߟ¬‹Ìý^:;TtÎ:ƒöb·(ï¾Ø×WOëo‡®á7ù‹z™Çéo—ü#Ÿ½ižœ'å“ݧyî{ú˼p×¼>MÎûÚ¾VOkÇ?—<ëPÊÎËêïø;xŸyYþ¢Üø«(ÇŸÄ8b¿QŽþ†ná úUŸ„_Íåûškþ¶žòE¹ÖÜP޾¤^ã]oÎ8j¼ÄN/à!z–zѯ|¯^ÍþŽ|/ŸSÖ¾mÖ‰è1ý0Úqò§ûì»'ðåðŸõ€ó{èç{ÁÛ÷·ïÞçÊ|w5eù2ó&õ~“NÒC:0^õOÖæêòì_PÎ:A¹_à/ó õõ—ÝxÅ´¼ ¼¸ßž¸éRé'ýŸ¯°êe_Õœö²ÏJÞÄðÜùO¿‡zhí4û’äÙç€Î®/´/×óý>¾7®À}NíÔ[(k¯Æ.¥¾q(·ÓÎí®žk?ºÿýŸÓžþƒðø_9?:¿)·”³®ØVé1ËòíÄ?°¿â?àȺøâçá}ì!éN;Mïã7u^¢]óøWyŸý Úɺð¡i?ꇱöçÿÇÏI?‰ã¡^æCèÚÄó»¯v3åð톶ÏóÕsÉÝÏɺ’ríG]3΢žÏä7ÞËò™õ³ëüBûÍ~.Ï_PÁ—ÜçÎWu;ÎS”µïêyJ{­Î#>§ý±ïob®Þ/‰“ãûfýE®|l—/ÉGãÊ€+¹ü _Å ?ï ÿØeÔ‹?~Nü ßíbY_‡ò Ÿ$q<ΛÔÛE®7y¥Àϸš¸8Ú‰ö´7SVËõ“~ íÚWUú$ñN<Ï>3ßéOʾ3p¼Æù‡~š²zJzÖx©éxºÒC¾¯õz8¢¤;í‡þ<Ï:÷ñWÇäÔ7žG¾ØÚíÒÙý›øÅé7ö‹z@9­ä,òÄóÆÅ8³®â}½Ÿ“uõ+í—øÊÙ•¤§r@ýØAôoüTðŒ¼ì¤^ÖCÛÉ¡sö -û^yuyt¾=Ÿ'îÑï#ûÀ¼wž¸à1.KÿšöPÞƒÇøÝx¿—ïïaN;æYBŸfÝ ~ãÇå}ÈûF._ä¸nP^åàoöÌù>v²|Ãóì÷QŽß†ïõ—:ïÆž'ß‹öãç¢~ãߢ^üÊåÌw<Ï|¥\Õóp&>üè׊<ñÞý˜ôg;Ê«íÐnì?ÚßãÁy¼Ç¿¡<ò<öŸxæ½òÿÏÃGŒ3qºÀe|TøæÑy9ŽÞ›wàóÌ?¾W‡œAÑñó¨ç¼xíe]I?ñ{»‹ÿç‘“JOeã¹üŸñÇ«i/~UàlöÉzó<|#é¯ÙVޤ7ßÕëÃFÎÔêgñòh¥/”{õ„rO;ÎÓ‰k¤^ö‡¥ó“Óç;Õ¿ôçü˜u£zR=§^´<™æú3×\GRŸã{°¢?ÏÝÏSŸf¤¨G©WÇÙG/ò]æ5Þ7v õ"'¼w}õ}´—ý,ÞÇÏA»ñsÔz‘çÙ¡Üø=x}¨$oâk©¾õ9㈎çÍ~ ߯¹ÿžâÏ/™?ÔwOTü.óá‡f½ÍóØ”›õígþW~+=yÖü¯Ü;.ÚÉ9Lõ€üMÞÄÈ?ðAöe¤7pä4õr΀vwÓ_î% ~î' :.¡ñ#«o¥7íÆ'½¨ŸuœzUzI?Þ‡nêYÚ¾•¾ê]ù‰ú£û4້—¤~sîC=%Ýè·™©ŸyO½Äûƈª‡”ã&žEzIòø#…ƒrì9àȼlN{¯¬¾«ã[êõväI¹áûؼÏ9 êeM¿™xnœMø^8©—ø?êÇ_Hžý0õ0õ\‡ÅÞ†Õo‰ûä}üˆäÍ~"íÉ÷‰cެCÄ—|-?ËÇ´?z·æÓçõaî»!ÏùCùPþã¹v¨xr¾sß\ÿr}®6q”½Îó:~#çO”CÇ3"Ú¡òWÎiÚ^OÚw½§~©Ï)EïŒéÛ•>êÚQ¯d¾ ÝÐÍq>Q}ç<Ã{ÇÓÄoƼ"¿ÂÏM¼—r&¾„zñÏò¼Žw×_ë=!ú¹W®fœ±W¥p&§^ÎQZ滜ϑμÏùðã:Àsîoš{nÇuCÖÖ³=áç}Îk:òÈ«z]>žÍ½>>?ÛÜyJ>³½ªÝæ\ŒüÇóÌcÊ=õ"ÿÛæõ@Î}ð<ó=ïëûÁê¸×ø÷ø¾™xŸu6ü˜øaõyâkè/ûŒ”]Ö÷3z_œ¹Ïƒ·~üýŽ ø’Œ/åz>„þß×ù‘zîï{ÎR=WŸwÌø('Þƒçñ;“'.›<ñLLËͽ‹µÞ OûÒyÿü8³/ÄûÄm;ná¸ržî|Á+íØŸóuâ7Íi§Ž_kΙ 'í5÷~‰'øo4žz5÷×X6W/OøîIø™ï³¡ßÄ0N㮈½Áóæ.p¨Ï븠ÜE?M\Žõ«÷ñãÓoøáÊy:Ĩ蟸IùN<Š7êÀ_ŸûÖÞÏ9Msçë1ÎÚhî4ç»úÞÆÕ9õ²ŽP難ÁGsœç±óù>ñbgæŸ×ú?ö㕾V?ƒÏæ>7õ¬ü®þïÒáÁ‘œï³Ÿ!ß"Y—Ò~cOÐþnʱ'ÈÕgMÜxhüv<ýLýÆ.ã»æ¾7ñËwÒeìÞýË™ÿ GöÃ('ž’v²ÿÅw±“Õwʇô¨õ2pD€ïæžÚ‹¾ s×[ñ'@ŸØƒÀ•ó8ÒQ}<»áÏOK¿1û¯¾wÕs‡ÞÝÄg*_|·î\9¤ÿ–òÃxFïëŸÚáõ}q¡7ßç|°zï›}^êåþàjÎï˜ïŸŸoÿ˜Ïåå’v3+׿´kœGâEÌi'q!À?7bN{ÍzºÒ;õúº±‡¨WïƒG/1Þì›Ê÷ò3ãOÜ<ü–{(ÆéÈ¿7v#í?ΗÔKãÍ|XñEìêÅÞ z*·¼¯÷‡]Gné—ø ½œçáýMž²^&O\,p&.rãW®ä­ÎGïÕTOÎ…ÚïÍ×>¶>kî]à}ü޼×~iÎyÇ_-}ÀW­—×ò©|É8c·!çYwÃïîïjç×÷j­™[yÎ>íÅ^Wî*¾Ë8ø¾¶Ì}žû;yÿ‰ú[~!½U>à}³/Ìsý¡ñ[ñ]s~„z‰¡ž~êø»¹Ïž²ëˆÄu@·ècÆUÇáì¤Ì§Èkìsêy¤ñ·ž™ŸG’[r½nq>‰_·Ò7±3äçj¾i~O€qf>rþ’*ø´kÄŸë ç ÷®ÎÄYOÁûæ÷ìG9±Ì÷áÿJ’ó]sî¹=ß4,Ç9OÞÄÒ~ìZžÇA?ÚGîÃì§žóLü)âú…_ž˜—ãÐÝzÒßvä+Æeû™Ÿ+ýÑÄVúH>‰=#ŸÉ‡ò Ï›þ-×9ý:?~Ÿ9ß™7ç†Ôÿ<¯ïÍ:‚çõ½õ½xM2ãŒÞá»Ø‹|_ï‡eŸD¼ˆ'ñ#=Í}n.ý€cÔ%^é¯ñ𾉛•¾Êõù±=éIž~Ì…Gþò¹ýÙ?ß§ýJ®ã‡í+ÛQþS?©çè7zN¾E7rOÿ‰ÃB?xï}äøo¦Ýøáxï½±yßü>Ͻ§%óx—.à)þåR|ñ<ó¼|&žœ?ÏÅGäˆörþ޲vas?·9ÏsNÀœ~Gãú(7÷XYfœÍþß7÷´:ÐNîG¥¼¯žç~Bžç<·öí5÷ÕíÆïþjû"v¦ò/œåGòœ¯9=m¯¾¯9|Ìóð1ýeýÏsíüÄ·9?gÖ#Œ«ñƒÚï#UY¸—ÜCRµ»æ¼$\òq=/É÷Îã3þH¾‹Þx°’+ËÊ—ßÙ¾r¤^.õíÇ®VÏÒn“«o-?:?¾ºÝf¾WŸ‹7ùFýF¹Y7Ë/>§ßÐMzÒO“KOËè¹Ø}â¥OüîõøÕ÷–¡cÖ[|—õpg}Å{ãcÔSõ¼¯¾Ê9,è³Þûµëߨ÷‰›ûµ)îã«ÕƒŒ'z÷M¼‰e¾K^ëKúoö“yÞè+Þ'®“ç¹—‚çÑ[•<4çk¡cÖÃÒÕú”›x~¾Ÿc;ßË¿ò|œõ}FÑ'ÊòbN?Ù7ªçEåˆú½`¿ÕüÙìkUüÛÜO¤<ò¾9ÏKͽ°ÈMí̺ˆþGýê ÇWëká¡ÿØC<ß ]ôgäþzÚiâKk9¡ÑøNå…¼>¯¹ Üü®õ›ýiðÖœ“·Lÿõ¯§^üöμ_óþ'àmô½ú\yà}½n˼ ÞGÏw~G ú5q2¼Ï> tON?»žœ¶¯‘ß%ÏÙ7 ½Ü“õØ´ø¡ªøˆöb—tU¾¿â3Æ™2ýX?û¦â§Ö'Êk•7ûœ–¯œ§wîP®€G¿çFï;­ù›÷ÍïBÉ٧âyÏÜœ“ ^æ‹z^à}ó{Ô½oš÷Ùçrüä¿_=L9ó¸ü „î–á«Ø¹À1z¯!|{3|—{ÛÉëý¦Ü¯$]…[ý}š}ùŠï=©>àû¬—m¿Î}>êó«±k}O»Íýøê õÅþJo_ôxnÎeª·-Ó~½×ÜKLÿkžÃç»Ú ¿©·Íù>|È÷YßÑOî³®ËVüK»M<¨ü,󼾇+|ÎóÑûÆ€3ô¤½Ñ}]é¢ÞTŸÂ×ñ/B7‡KbÖÔk~çN~‘¯åçZ.…ã‘éûú¾Çf8çJ{î«%îŠþbkdV¾QOÑÎ’×çeêý׿÷ºöWxPn”Ç¿¿Âõ]‡ÇžS/P?~LéÌ8»óáùzkÆcK/û¥ÜÄÓn~ŸQ~aþ~µ¿sâ~¦~åø çíè‹Ü¼¿*÷kÎ/gæéWß‹×üN“ò­¼Kàž¨ø!ïí¸âz°ê|Åå ÖWò¥ã¥]õ[âpxï¾åš÷&Û/ð4÷‘ÓÎSPì÷®ç}öíÕW´g¿¹9ðæ^qÆWÇ»æ÷Ô('N—~ë{ ë¸êÚþoî7¹²Â“9ã[Ó2ŽÆN¢ýѸªšÎæ|Ÿu˜|J¹þ×Í}CÛ*9æ}ý{lÚñ§¨×÷ÏÏ/ñûZ~x¾ß¬GȳîU©yÞì?˜ƒïÀqf^¯fýC½æw'yn½æœ1õ›ûx>á}Ö•üig(ïÍïéQnü¯ošÇSÖÅ”õ':¯x~Éö£w,¯ü2º¤|Š7ñ$=€o4nÖÜçÂíwÎkòõâ?{dZ?ö7ß'Nñ'žd2Íë{²Ïɼ‘{_kzKgúkîùà}âJ¤7åæ÷t®¬ø ~N{Í=ÒGº9/0Þæ~ ˼ýh/úزú¸Öú=”zߪñŸ‘ÇÞžœ— Ýæ<3üÑü¾—øT¿ªWù>÷Ø‘Ç_H½ëêñoÆ©ÞSŸ¨ç®žÖËïÌžžÖOü‹óˆ9p7÷Ô|Dý&þ“¼¹¯8Ï©½áø(7~4õŸããyô¨ôô¹y¥ÿG÷éé¯9o·¿úÞ2ãküDà9ñéONŸýÝ÷‚‡ü¾Ï¿Ÿ|ìþ¿ÚŸžßs¦Ä]Y8›x²jhÎÊ¿cúŸqÎïÊÿ•üËçÔo~—´âÆn廿÷ å#Êñ“PŽ~ Ýæ÷Øi7ûUäM¼…úäÑŠ/³¹§‚ï›ý^䱎+M¼ xóþ¬+è?÷#Ç{è/÷8Oɧ–ù¾¹Ïß\8c­8»ø§ws&ò8PÚÏýó”›ûxoÎ×ÐŽë¨fŸîÊyü7ñ´;z¯"øÎý“¼¿9Nü*pÔñ/É•kðð½Àó=´gþ½U½¬ (×ûÿcñ•ÜSô÷ yŸýµµôys®B½þêótTýÀwõ½âkÞ'ÃóøÎTrM½ìð}ìKåP~Vþ¤»zšïã×¾æw6h/¿J9þpå¬âÓØµ¼wÞ®ï×­ýݹ߅vš{¼ªñFÀ‹rÐÜŸýFïW¦±ûV¢ï+½ßèyÚ~ç}sõF7ºÆ‹ø¤ÿFOûÜÜçÔkâxÞÜßhn}é ]lOºšWðžÛ¢¿&D}E¾¥½øÁåÛG¦í7çHøîjÊcy}/YâŠwsO*õFùêL¥/xßì³S/û#ÔO¼°òþêó•±ç©—{CÉO†¼æ~Ê{ÁãÍ´k|è~ž×÷rxOè®Ê¯"§ß‡¦íyGâµÍgsÞœ÷õúü…>7¯êçwWi÷ëïÕûæ¶CýÄó<ú_ý@9z^ú)÷Ò‘÷±ãÀ{sÿÏG§º7òÀ÷Yo3?G.(žãy~×~õߺÎÎz“~›ßå6§zÝ’ý-òÀMýæWÆ]ÿžPìDê)׉¾¯íÙÆ¥ÞRñ¼þ†&^Êy…zY?·z?¬ŽÇˆ=J{ÚgY¿7÷ï³/'¼ŽO}í|üÍïR¿¾³ÙOîæ\åœë|p¾}á«ï¨ï§oâ&x9>Ç-þkþ—îb ~s y}x~Ç—vò»©”›s<À9ºžTߨϨßè3ž«ÿr~˜÷æ½Àóú>IõÈè=”à-óåØS´“ûåCù[¾¥Üüîíf¤¾¡ŸØ‹<¯ýyÑ;<¯ï mÎ1lŸÏãÿU®É›8JêÞóª\2þ¬+ù¶¾ú ~qåN¹Ÿ©—¸ðîú\¿vžtÊúžvOôà|»‰‹s\ê[Ç%üuÎw¹ïá‘iý¬—äGʱƒø¾ù½Ež7÷IÑOìgàϾ|Í§Ž—ïšs7ê?õåðmEÇæwgóûf΋Ì7ÍÓO~gA~§æ|³ïëFÆÿ€rœ9' œîÃ{çnÆ›ý2àʾ™zl½9ð]M{õ}ŽÑê-òfMý&.•¼ùÆÙü®4ãk~K¹©åƒ~¯£æžhåþ3OŽäÍþ‡zÁüÊy=YŸ/jöýýŽqÕë™ð锳xÔ:÷ý¶ª¾9pŒþ^¬ò_%^þá‘ñwì!úþOYÇ[ÿÒƒ/ÖÜŸªÜùœþ¨¾®ôvK¹ùÝXs¾=w͸šû§¬G;Y?Qɿ휙ÿN½Ñü^ù¨\=}ÌcßÓ}žµ±ã•åH¹B¯×ûéÉh?¿ÓLÞ¬ÓäÆ?¬ó…|Dî_å\=r¿2íåþ4s¾÷œ·óJîsd¾ÜH{ùÝ&øV;;9pY?ûƒôkÜjìê7û+”ãW“þ¼oîYw~þ¼¯§;å±\¾±L{M<·úŒzYGÒoü’¼¿©gÁOcgËWðEó;Âèñ¬ëÁ{â˜ëÜ÷uN{5Ÿí’ s³_Ÿë¼Þ§Î>xo~’úÑÿä™G¨ŸyD¼GæusúýºŠ>9ŸÀwñ«P/òI{Y_Š'Þ×ñêÅæc¾O¼ˆãNžç÷Ùø>þ½z^SO©— [ô‘úG¾BÎÇÎéyßB#o´_ß#^Ç-ÔûôyüYÀÓøQõš{h|Üßç¾é%ŸÓOìqÆŸu)ãö¼Aô+ï=—ß=¥Ýú÷ÄFïoÞœ¿åûœ»¥Þí´¯Õ¸GóèsŸWxf®ÞþáûøUÄ7ß7¿'+ÿ('>W?‰o¾Ë½ÙÎWЧ¾K|Ö¿ÿTÇ9G¯:>Þ'÷¹ø¨ó|7ƇϲvpÅŽ4û^y•¿¯®ðc§ËçÈ]C‡š–ù>ë]ôyöÕÁwèÁxv3žì«ÓÎ^ÚýXàÎïÁòý>ÚÛǸoŽýô{+Ïoc^»çøîÀãÓöî ÿæ÷¦©ÿBò&þÈœq4¿»äsàhöùxÞÜOL?ÙŸ­æÚ?ÓÄãPÎ= Œ+vŒeúkìÞÇ>qþåûœ/Žæ>tÚKÎw£ó(ýîÃ*êwàlî_†ÿšsãÀ—yvRáŸ~2/Q/ëž'þÚÜç~ïüƸô›&®Z~¡œý õ…ôs\<|KçZž©Ÿu·øPÎ鯹ߧ–wåšz¹¯|6ñÉòyCŸÄo/ÞÄ?ðÊïn‚ïÜ«C}ãtvב'åº4¿Cæó:÷=ýæ;ú‹«<+ç<í{¾×‹~¸r^ä¼’y­_ÎÌ·½Rë—3•þ>æí•O¿µë¾ë“#ÏþúûÉ‘¯øoLŽœúúûÉ‘Ó<ŸâuräÇ)?Ä{ó·¾É‘7‘¿púüð“Óú‡Ïß=mçðîÉ!¾;øÇÓ~òýSúMî˜Â99ðerà¸}*G“Û¦ø›`¯Mn¡?öÇ'ØymÎ{îë›p.prpüà¼xîxx?4í7p?Âsðs‡ã¿w\Áxש>™ÜÎw·9NÆw+㽺ì÷9ßÝÊø±['·Q¾}ª&·Ûß”O&€ç€x†>ç§xþ8å?ž‡ÿÚaޟܱ›qÒ_Æ ¼Éá/~/drÇåÓzÀãêàùí´ýíg·Ðç<'{éo7xÂnš0_Mð3NØ·›NGè÷ã;Š<¥ý£Ô; Ýïî;i÷Nè~'x:FûÇ®"§þ1ð{ìg—„>ÊÇÁäñàÏR¾CÀ<¾Ãàï0ßoÊkä^¼0ž£Œã(ô=J½£U9ò|ú…nGÎÌë—Ãà ¿ÊÜ„uâ{xBœÐ„ý— ë¼ ûÓÝ|ý;Ù 7ƒ§}´³ïn93/7û‘ß[•ú‰üÐ~äHù4§Ö…“ÛÏÌóíðu¸Wþ ¿·3¹ºFÏðGŽcT®áŸ|ÿÞÛáÖ“[ÈÅ;ëÄÉ.éÊ÷¬S#‡Ø©‘Gü4“çLówýÊw‚×;ûpF¾ÀKrå ¹‰ÜAì¼ öÛ„õð„¸Ê ë°ðßêù‘ïÃôÃúlB|Î?îd7ýî¦>qÐâ '{à3ü“½ÀÑ”io/ß«ïäû½À½Wy0§Ÿ½ð)¿ó4Ù#\ÊS7?.ÖŸöQ'7ŠÊöw3ðÜ̸¹ßl6Ç>ù…þo¡çßýŒ'rù¦y>»ï"§ôyeœM®üÒOrøÈù%ò\çÊ;õoÆupÞÆû[¡ç­ŒïVðžñ˜÷­à?ã"w>÷}êƒoîžà¿šì»zžþÊ!~þ ~é ûvìØ ~ ñrö«&ÄcOØwž|Ïÿ,xýòCèŸCÌC‡ÿ!æ£Ãàå0òzx÷´Ãàå0|t˜ï£“ÓžóÕaÛEonsŸ†N‡ÁÏaàe}}ÄzmÂ:mr£|\ø'ÄÙÏ䏨ïŸìæ=ûƒ“=Ê£ò«œB×ÈóíÝÌû}àMºî¾}TrÄwûå·Šï¹O}ºaÂ:eºe‚ß>ú?ð¿ö„uô¿Ø„õñׄ¸™þ¤>þÜ q¾î·°/5áœE‹OÞ³ß:Ù£Þõ÷¥Îôp5xQÞø^¹T^£?€'ú€ç±›©»8c/ƒíz~o6ß"¿›ç§«2rqÇÕóíØOÖ=|·Ÿò-òøPîYG¯«ÔëøÃWÁ|;IýSëcõžx£Œ|†¯’CçØ÷Ð1öÅãàïF×âK|§xËú =q€ñh¿ŽgCgèyáý­ylž¿2ïËGÊ!ãÁ¿=†ß+v„üÇ=>3{j2ϧÜ??ÓæÀ;8Óx̺|¤ì{õºy]_8¯¨Ú^è8¡7ñ`³œúœžÜd;ŒW;™}®™Ô¯ì«Å~ÆÏ9Á_6[Ç"GYÏÿQÚmrä õÌ}~Õ´½¬ÿໟ¢rq|¥ß;/Ÿ–ï¤ä´'pç;Æ—u$ø²ÿ#ÈsÖ“à×uëaÆ}øÇ§ïµ7Á‡(³4!nhB|Çd§ôÞð—ú3óõ´¿#Ê!ôͺSyç»ÃŒï0ø‹}“¿›z¾ÿÙi;ÉÅx=Å_'>¡CèÇû£àñ(x ]€ÿNøúN¾»“ñÞ ý›~½½|çõ<—ÏäGéM¿ñ«t|xlOxìG¸ÀÿàõNðçºQÿÌôŸÜçU®'ëð½ }£·Õãµþ§ý”œ×™Ü~ûƒöbðÜùŠs<±ó²à <àQ>¬ç“äÐý¿É-ÀŸyÇy|p¯u֓ʇë`õªv v6û0â;&øÛ'ìLðk§|¸!ׇÎT9ôNüú—Á'‡ÇAðp÷Áç´ààþÅŸó瀣×'´{]Wÿ3›÷À ñ\ñp_]æÏ}ÒAþ¡|«üÞ]‡ÆÞB>bç W±›‡ƒÀuþ~hÚîÁ'çñtˆþÝ ¨:ˆgõ«øîCàëÐåô^ãGç}üúâ[ÁÁÝè_øí ß||ú]ôýDÏwô>ß¹Ÿtø©ßÐcñóY¶}êå{ônöéç üê|%_Ç. ÝèðE|Ë„8³ ñsY/iwèÿãœÀLïÐNüX”ã¤çŽ&72ެ៬ ¡K³/ÀóÝðÁå|*'òínè˜úû+¾¥â½fëêícœµß=ëúË>2õ£çäGð?õ²ßÝÕ'ćÍìæ!÷•²Ìü½%«ÿäà½ÃïÍáã¼§ŸèMÛ½r^/ëŠÿGy?à…8Ñè;â+&ăLˆžç9ã;è•u&ýg~£õV3¿QŸ¸Ö™?A~z¸zO}âÿ'Ü;ãÏ+*ýhº7þŸÓ.ç&ÄÎöá ¿ë¥;¡KÖSàõÎwC£Ô;Ê8ŽÂñc€Ï#ð•ëúèú;(}y®ßÕx÷qôÿJWéé<¥œo'×î|åþç±'œ³Y3qõ½ûÄegcúsôïè?òrø7~ñôëDÿ‚×Ãè“ìÿÓ^ü ´—¸rñ¯]›ý—Ç«ïá÷ÃðiïÃóCÎKŒ+ò;EüÌLÙýuýÍÊgÖ»´ãzüøéäJùÕÿ)úBû8Øì_꿼™÷úI÷¨ÇïMÊp¸ß¡œG:r¾aB¼Öd[Å/œóu|rÅ4­ûáÍz :fÿ ü]°\~¸ zÖ=ëÍåCì ×C®£2è}~=´{ŠÇCô{½¤?/ñ.à'ë{à½CûÉÏÌ—õªxŸY·÷ìWwö¡güq«=%Ü5œ´wq'ÞƒzÚsYPÏø¸ÌkÀ“xðã~–~'õ`/r~uÆùý6ÚÓÿàþûû‰K:üÐë øL¿~ˆÌãÎÛ´“ý/¾3ŽÍ}å?ë^Æ?3ãt}ÿ2㉛vÒnüâêSéûÇÐ÷‰JÿÒ~rŸ[ÏœñDƒÇÄ[ý8eðzúfþSï>~a¶^âûìÇ 'ýfTçò/pi·6ñÐ9ñ§çár}'ÜÚÍÚÓÎÙ?£Îed™u0ðeÿÇyƒúœwŠ¿t'ðï€.®{µ+¹O!ëeâý'œ˜pž2ö‹vǶºÌx|®Bú„øñ ñåÎ!'^+v?rÇ}SñK†^ðsöY©èPÏëÐ)û¡À?4¹û0wÀÿw€÷&îVxßAN¿Æù¹¿­¿7t†Æsžy\¿ç &Û©ÿõ¹·bfS/ûšŒÛ}ûø'”3ʉØVÉõÖÜǧ?ýY¶«?ŸsAÙ'ØO½¬ )+g¡?úE?SCð;ÝzSF¿9Dÿ&.’ñ&–v3¿#ñ_š¾=a~ }y÷´ßØà-þôtâlé7ëLèš8Iàs?6å¬7xžy ¸²>¢ýÄ7B‡coŸöwŒñê¿=¼wÿ]Ài|#çPfñ8àÉøhíWîkÅ-ÁOñ'0ÞÄŸ—þ¯ø½ÔÛð©ræº/ã…wÒNöõwöžŸŸ3Ãßñ›ƒßÌ´;V¾‘ÿÈ]'º}C^Ÿ'ˆß³¢ç.rý‘Ûy¯_Àx»Ð8S†®Í>%pÞ ½’ƒ‡cè·cÐ'ñ¯>‡/Góë«vøžsÝ™WŒä~™¾ƒžœoœí{Áê;÷i¢çà“ÄoÓq)ñÏ3þðíGŸGý­ñ§‚§ø£ãÄaÃ9p¦Ò;è:Î>ëúËz8³^àûð#òšý!øýz3ë{à>žš8 ôªþ’䌳¶_cìLä.ëzáÏG©ç~}â9€cM{›ñE¥ÿäŒ×x„øqå7øÓ8Äìs~w²]>¤ßò#xÔ_=hNûúá§ÄóÄ}ƒÏøÓÔ›ò3ü»º5öøV>Œ£TžÜ7NspèàÜÞ„{7&œwÍ~çÃfûp”݇‹ü‚·ì«€ì«ð]âbGÀGæðnÜR×%þ*|éOü“õÀ~Fé~ßx(õp;îšp¾5þ4νÚÇœs ~¹6øçþž ÷­M¸—kÂ}Ù“ï&ÿNòÄmÇmwÍë«ÄRNœ|‘ù¾KÜpfÝñ¦ùyÛóOî?¸ÎùÔø§\è§Ô®w|W‘'®øôƒeýG¿9‡Üyo;ÐÝ} íç…›œ7Èå³ôþ“_ø~;íg? ýzýš|%ÎèqëùÜòÛ©Ï8ão®ÃÏžÖ¿‹ïã/BƯ ½·¥>®&gžÊ¹LsŸ×õ€;ç3ßA?àßxºÌ+àyÍø0æŸØkÀÝØsÖƒ™ÀÇQà5Þ0ðÁgÁ×!èðãÓ<~=èíº.û×Ê̓óü¦þÙ ¾ÝŒPŸ{ñ&Ï%çwï#×ñÏC?Î)O¸÷e¶O }2/ßèUõø=oÄ÷î£ÇÃwú²/Èø·•œú¾×Þ>c|®“ûœïrÎøo­õ#ï³ÉûÛÐ?®³âG ý¬?ä ð|—øºçëéhìsúIþSÔ3÷¹õëï­‡Þˆ]Ÿ'îy‰}θ!ÏǃcŒ÷ßÝïB^îBîï¢îi˜p~?ç~œ9¯žs!ú9b—ÑŸûëÚ-ÚÙïÙg‡^Ûå+øqe㜳Ï.ÿGöAég7på<íçœ ãÍ9PÚõðñ>‰ëà»Äw@ä~g;¶Ë÷‰§¤žûñ‰»çyâô®Ÿ–ÇŸÄ?òÇÓrÖ'ÏF^5}¿;ãN<øŒÞ¤=ýîÇ%þƒñÆ‚^Ï<øp•Ãg™O…¼Æ?Ρê=ü¢ÿ:þúO=ËÀ“qGžû½ï‘C㳎ÛV¸›øðž8ð˜}+ñf;æâ~ ^GýŒÙ—¤^âÇá“Äã‚÷ÄoȇðUΕá>šÙ:—v£?Áwô'òŸóŠ|/÷@Gíöœk ø™¥û™Š?_øR>àûð£ú’þ_ ÿ5ûAè~<äüáÛyÏ|‘x5õß=þ¢½ìgUýk¯ oîE^è…Ãoªè/ݤ§üÅx\Ù/¦žûÓñ Ò~îáìw79í†þð]âúÕŒ3ó–|@¿Ù×A~GÀóÜ+#>Áñ­úià ~k¹¦ýœ¿h~ þÕ³ež“>à/ç]xŸy˜~·¸vÜÏF9úšvŒjük´§¿\ÿ×.ÆÑØ¿à%þsðâyÍf?žñ©·õ+e_^¼Ð^ì[êÇþå;ëû}ðÅû›¯ž–sÏùnÇA®}ïºÓýÑ&g¼ñ3ú=ßåzÁ~‚'à žà‡æÞ ð{§Î¯˜¯ï|iÜnüZÀ•ó³à+ëqÆ‘¸éÎ÷îË®»=7Á½­‰‡ÖÇïALžM¿Í~pe½–ý"äýõŽÉ?äÑ×Àu‹rD¹ÙgNå3qÏâ‡örŽ’ñí³]ù þÝgo9ÿSÌO—O¿ËþÎãÓzYw¼='\Ò ¸sn„ö³ž¤ÿÄUS_{:ñUèóìsƒÇÄåÓ~â¡ÀSÖq ü±gOWÏ«YGÙŽíÂlj'ãûĽ}Z_ý¬žu¾ÕnKyâu·¾<ý¾ž—Ž0þ#Ч‰{bŽ”ùÒxºÄ¥ÒOì&¾O|ðÇnAÞw'¥ß%Þ ~Ð^7"ûÀÒ¼wåð§íBŸœ /®²Ž‡³^a|ñ3_ΛQ/xƒŽÁ/xHÜð$·ß'®þHü.ãÏy>è˜ó“ò|¢}¤?D9Ï9Úã>ñÄÓp?ð̯Êóø•œGy¿ƒvWO?;)gŸ 8ßN;7Oâè¡_âpx½à<@{Í~5íd]ÿå¼°Ï)g=Ï÷Ú‹{Égœïµ2_ÀÞkå~ií×6nÝøb÷­þ4ù·“gŸ:d½)žî}Ÿ;… üç|õr†öš8'úÝ >Gʺ“vPéÛ¬ x¿/Ï#mîžØÛÛ*yÎ#ÀýE;‘£Jÿ%NE½gÎóèGøÁûòrΓþr¾óªéóÌëÐ'þbð?1㾋~îâ}ÎÐ_ìð«ß/qPèŸÌ'Î#Œ'÷ÏA÷œ7ä¹ñ€®ç¯/¿“çÞ8Þ»oï~¥ç$ŒGt_&óÙã”… øWsžüdž®sð›øYðžx/ʉ¿±ƒ€/ñ_<Ͻ^´¿˜ø¡¿ø“)ÛŽçµëm×øõTöàóäÀ›|RÕgüÍ>r~C>-”ó?æ|—þà‹;á«ð3|“¸øTùˆ|1ÏäžYÚÏ:|&>š÷ñó!YßR?ñ<àóúârÞs~Eù€ïÏO?±ÃÀOø‰ç¹‡‘võŸDÿÐöuÁWæsõýG¿|¹zÝ£·Ôcæ¶kY½F;£÷¢gGü9 =ÿ|®c÷SO?üŸx.êå|µò”Ïø}é/ôä}ì§ÝóürúÏâÉñó¾9‡Þ¼ÿÆýñÄA?0OçìœÛ–/ԣ澗_à·øUÉ/v,ãL<íÅ ?E_ñýŒî?‹Gú‰_ŠçÙ¯€O²E^?#|XßCÿµô¹'†÷‰›ç»Œ“~3oˆ_¾Ï<½r^:këwѾæwM?füDìBèù§ßøk αÊ´? eãBsÿýå¼3õgäø,ƒ§Ôçûøex¿<솼ÇËûbgÃ?Ú%üžMâýùÁ‚ĸnœbΟ‹7ë1îÔW«—€+qB‡Ð×à7ñ>>wÞ¸Šú´ÓÌ“à)ö ße_€qg¾d|¹oz[¥·è/÷ "9¿YÉ“þüúž‰Ä½Iïíó|ÚÜ»Ãwò©÷IËŸ¹‡çÑÊãOሽJ{Ù¿{œ2|˜óãÐ+ß+ïÊ3ïs9ôÏ~–zzð¥ó¢rª|FÏ¡ÿ²/ÆøsÃ2óXî‰xÇ4ŠzÙ'¥^Î?§~–¬“ø.ëðé=_µ?/÷hÇø ŸúL½çº!÷™_Öuê[ø)¹ty;ôB>²Á¸r^ xrï†ú¸Â?|/œÆ³$®X½sÞøL?¹ŸD}Xë%ø&zšþÔ£õ¾`ä:ÄŸc=úiî™{wõÞúÀ™öÈë{w“ÃÿÉ…>< Ÿåü9ãQÿdß|eÿI¾…nñ_ò<ç¡êœúñ'˜ûœö÷:Ï uÜjî·4w^µêé·õñ<ûåðCö¡ÁwîžØ=ê Þ»ÏØÄƒXŸvÝ_oÈ|=§þ ?×÷¹oº%g¼¹w:åü©ù›ø~7ùóý¨oAÇœÇB޳~W¿ÓŽ~×ìïCÇøo}ÞUÏ·WùƒU.HWž7ñ³Œ7÷tAßœ?¾œo‚¹‘ñ$~–v³½\Ïg==Ž÷s²âyô;õs^Ž~“3^W"q/Ì µ=~ZÚË=Ñô—sŒßó®®'ô¿æ~&ø#ötó>†È“ôâ;ý„¹ßÁÜ÷Û†óÄ}ÁgÑCÐ'öíÇŸ‚þe<ÙWŸðQs^ =˜¸MèØÜ ËóœV¿©§€+çt¯œ/Çîoô<‚§¬›Å«|‹œÅ^ÍïÚÁù}Û•žô›ó;|—ý3ð—x<à‹ÝÍ{õ—þcÏ#Ư'îŒ~s¾úxÎÔ8jïëó^~ïxÂïWÎÎY#O™wgÎϽƒþÉyhø4ù¤¢£íJÞ7÷á)Ÿ<ÏüCýègÊú³ã_Ù6¯ïŒ£ÏïB¿Ü³õHÅ·ð¥ñÍñW—ÙW’oÁ{ìè‘{Œá·àå+~æûäÀ‘ûŸ KîƒÞœ«‚Oý0íÚ»ÀÃ]Ôí¾|¼9O¼ôNÜãËýFû«2ø4n!û+ôŸýoè <ñ´“óÑô›{‚¯ë+÷cùûF9OÍûÄÇ0ÞœãÞ^å<¿~J\&íåwœ¯×´Çû›õ#ê»è¹w@WøÐõoöŸÿ1øç.¾3~Ÿ!ã…ć¿³‘8ð¡žp? 9ܹ‡‡zÚiÍú÷‘GʹW‡rö _üÄÔ‹¿†úÍ9Fê%î<Ä>ÚMŽ~IþBô6㊿š\³þ¥ð¯zx½[½ê>Évrã’^Uå™§€'qÐ3qŒëõãï/Óú¾Ñì‡gs›z úf]¢þ…?*õ]e½O»M¼íæ<í¹Kœ8xlÎK*ÏðWÎûPÎïkQ?ò%?3ŽÄ¹‚¿Ü÷CÙuBÖò5ïs_:íg–þ£ÿÎÌóÏØïnžŽð+ãÈ~ øÊïB§;¨×Ü£ÿ4ñAâ]:€¿ØðCâ¤/z)û"ÈWÖ¿Ûçå'ûÄà)¿ç ^²ôD%ßÊaÛžr_J½ì[眅í_üpòpe¿úD/RNüõ× ÝŒOÌ9sù8òûFŒ#qî–¡cîm¡œóñ´>‡ïÇ~G.÷VÐnô7ßåž+ù›vô#å|xŒ¿Ýú´Sß½ï\»ßÝT®ùÎ{MŒ‡5þÍ{úü}Fã7ã/„³L{‰ëA¿ ãŽÝJ½æÞê'îø©ÁW“Ó~~79kü—–­Ý’ÛÎݼ7G>Gý¤cýAýéÑ/´—u·ïÁK³¾Ÿ‰+§ÝÜC=ɼ”ßKT鿹g>Í=óÈSâjyž}DêçwáËÄ3C¯Ñß¡•_ÉsÞEyzlþ»Äk ï‰/±ß§]Æç¾[äxëxêÄÝó}îw¦ßì—)—|—óM>÷{úuþJ|%íÄŸÆóøÑ€/þ³í¼¶Ëw±óø^¿WâÚv“¿{šÇŸDtʼ?5¿Û¿¥¾åú=ð%ž~tÞ‹ˆvrî„ñfþ¬ùžñç<4ðå÷¨‘Ëüž%ýåœ x2~^?¤|”ûGœ/àǬƒà3åÉýø¬{”7sÚO¿ä¾)ê5¿?%þ [ì>ôDî°ú&çQè'ûÛ⽓¸QêGo~÷;œo¼ÉùÙøíÊÈ‘rC?-ïãožø;Õ‹Cù~³¸¿/íÆŸßç>zð“ýÆík¿g}Hÿñ¿Po4¸šïÐ ¹/ù"÷Iªè-ß3Ÿj7æÜ:ã;ºr Üwg΃Ioùxâ7„Ÿro:pÇ_ȸr®z&¾8òíCOûÉzDøàë—A·œÛá{Ï!¾’÷¹_º7÷ËMæå6öðifÞãûø®ž~WÿΧñ5~·S} ü›+ÿöÿà|ÿ9¿Bñ‹pÒ~ࡽæ<|é~Nc7Ó~æg¾Ï< ãg ¿ü£ÿ žWvTãm~G‹v²ï¼M&åÑßåûØÏôÓÌÛðMìbÚß>Éïl¡¯²>ÞÄa)_ðmüÒ<Ï} Ê+ršõíÅ>É:úY¿#OÑ÷´}¦|"ÏÙU~é'û à)qðCü´—óêÏ·Oßç^Ús}šyœ÷®‡ã—W?ÓNâ¬ÌÕ׎¾«ÇÇÕsë¡Ïsã]q=t>Ú“Îõ¼¶ÖïµÜ¹¿|dŸ¾Êïs#‡‰W:=¯œ®æw†Àgü |÷*ø/ç÷Wzþµ+vBÿè?ä:¿_F¾›q$.†ïb’+gY§‚—ü>íäw//ð»vaâ¼xž}Gç úiîáþìo'\‰#Ø_ñ7ýŸ¼’ å„ö³Î…Ù7^Íï!“眞òi}Û95/·Íï +'À•ø•«œzÁÏÝÕ÷Ê‹ò<‰¿U¯€—à|yÎç(õ³?FãÊà‡æ¾¾ËyÊñ3AÿÄ=+gÀŸßùOÙ/¤~â·ûãÙâ»ðü˜õ†eëY¾|¾æüŸ| ¼áoõ€z <~àÈ8Ô¯ð_î¡rþAΛßáƒr_=ýEï:¯HwÚ߯ÃÐ;~iå‰~c÷oäy«Ïoç÷9ÁOôz3÷–PŽýƸc7oüÑ”sl[¥×€/~iÚÙÃsÏ3ƯÀ8ã¯VÒ^ÖëðYüÔßmÿ´ÛüŽ<ýÖyìKÊÛÓßíò\êUäÓ¬Û~9÷o.9ç°·¿€ú9?"¾·¹/”rì9ø&ø†¾±“yŸû–ù>ï»j¼´:—د<Ïý*Ò‘ï² ^CÏ:‡¿r©9í‡þuîû+«þÈÓ®ô¯ø&9ü˜ßæ¹ã”_ó»,Ò‰úžKÎï‹S/~Hõ+ð6÷£Ó~s/:trÿ;ö òŸóæwOsýüÙOžÒ¸¿aMßJNÜ7ʽ´{DºˆWêE.¯vJGå~0úÍï‹?9_®ß'‡âGÜ_=¯¿·_Æ‘~N<ÑUäÀלŸažÈùSÆ™sò´ûA}­ÝÁóÌç´›ýGàmìÛ…šßbÞK\)xL=ðŸõ‡ðÑv[ö·xžuGƒïÔÛ>ß^Þ#—™×ÞNŽœÖ¿G¼Gäñd?8ò;)Ð)ñ¹â ¼'n8GãAiç(ò—øà‰ßÈöù>ç^೬Óh'ö"tŒ½¼wð]øÎ2ý'N8ó{oŒ§¹o¼ç*Ú5þ"÷r9_À‡ñÃXæûøè/¿3ŸÒOý;¢‰á»”ù>õè'9øÊïP_?°÷ey®ÒßÉòw%ü½i¿Üûþ¯!.ïÿÌîwù»‹ñ¯0Þœ+|üú@‡øIÑëY7©àÓü®üÿð%ójøI¹/s_ zCy¯‰o Ÿæ\?ãN<:r¹€Oõ·FÈïï¨úcÜ£÷؃¯È ãŒW½f»ÖÛ_ÉýÇ.V¯0.Ï]4ö&åüž2pe= Ÿ6û9ÔϽ¶Œ7÷P"Gñû¢r™ótÿ¸õGeÝ ¿†þêOñ#=Ä;ü½^²Ë¸³¯únô$øl~G¸Á/w×]ðIü’à)ó7ãhâ Ä+ò˜séà!ñìŒ3çè_öá‡ØŒÇ}ÏüËC•þ¾”ÝçÉ=÷ô뽺ÞÛŸûûé/ç=wâÔô“û/¨=I?õï2ë_Ž_}‘øêçžnÆ™û¸€3뺻i‡z¹¹ý]QàO¼/ðå>½gWz¸â=Dü¦ì{ðßçwRosšñå¼íÄ?ÌsÏ]7ç¾á“ì³*è£ìgížÇgüWÈAü0´û„qd¿Šïš¼DŸ_ã¶»«çö´“×€Ü$^8¼ç1÷CI/é Ÿ…è/ç%ÔsÀ{\Á»ëÜsDÙsY¹—xê{È›{ô3¿‡£Þ þ^ðcœOôyôÁƒórë>‰÷šå÷ àÜß@ÿúGü=çüþãHý‘|;íxOAöÅ(çw5Ô#У±·è×û*šûOé/ëmÆ¿‰ø_M¼…óí'¾O::‚·ìÛoî?¤½Ä¥"_YÏ"GÙ_VßÐOã/„>™GgüxðmøôÓçé—q&n–râlá£ü)Ïsï¥øSÎh?òF¿Ç€Ãs¸9GÂûì“_5ý.~@êúË•{ôjsô‡ÐŒ+þrêÇþbžˆ=ȸbÿA÷&©o?Ài?îGÇO_$ÎH9¦¿Ø Œ;û†WΗc7PnüÀå9ᜟ¾ð9õ’ÓnúG>Ò?åÝ´U-WöÇû&ž |$¾ñçžHÚO<“ò¦ž¬õ%ß×÷Îi¯Ú¾ç¢s®ðMóz qM|Ÿ¸0ð›{'h7çhh?çûœG ]×eù]$ÊêUãÃõ§oßg#÷wʸÿϳ8aÆÙøÉœ¯Ô;æà=öò—y |å÷Çš×îc'.^¼Ò^ÖÛà«Á›x‚Ÿ·¿ø1®ÂûýσŽW‘ÿ‰i=ý¯ýÓþ¶ã¯È9õØMò)|»ÊùüÔ÷Ó6ç™Ô;À›{HÌé'ïé?zÊï­Ïx<เĹ_äï›}Cø÷ tgü;´|Èx”“̧´ïþZæOêÇÁ¼ÖÄ¡í¦ |9×|9¯|‰c~{•?X½¿jZξõ2ïR/ð ?ø¿z&N>hîa¼‡ñ6çoGÖE|ßüÎxN¼ ý ÷Ká—ÌßYÈïÓó~ïý³k)¿„qù»ô?@þ\¾¿Š²qòžÑ—à¹Ñ“Œ3¿"?‘7çygâôä7Úoì3ù }ÖÜ‹À8B_ñ ü¹ßÛÜçgªvǬ©Ÿ}bñ|ú¥³2 ÷ùªOà[íœü.|áï\$î}”{õÀkü(ðKÖ?À×ÄåÏøSà«]ô4ýä¼õsï7ï—G9qò´“ý-¾oâÁáßÄëïÜ>…wå“oéºïzg×=í++éË+éK+éwWÒçVÒﬤ¯¤ß&}’ôiÒg¨Ó§Çy××ûØJú-òOP·¯óYÚýù'ùîqêüÒ¿_I¼’þh%ýÁJzr%ýÞJú0 _™>K};Ÿ¢í¾ï[¤'‹ôû¤¯®¤Cû¿OþU’8ù<és´ý;~>SàÁñõé ’ß~ÔÃþEðüÒïƒék$aømøÝ—€k­äwŸÇ=m[I†>4ëÿþÐJzX¿´Jú ðþ~wÍG_Ÿ-hóq`xt%ýêJúù•Ôóàß[IÿûJú»+é'VÒÿ¹’ά¤Ÿ^I?·’~©H¿²’~ïy%½›òo¿‡ößKzïÌý»÷›Œ]œükpò òóì±*ýën^>>ÑÍxZ^ýbAƒš??í¿B½'º™Ì=<ï/àw|CéQêJÛ_Ëg ¼÷í~t%}„1ñ¿¯ÂÑcÀò…‚¶_eLOÐÞãUR>O/t3ÞÿR7ãç/¸øDÓûïûëŒí=UêqñCÿ>ÿõ‚ž¤½ß*ÒcŒÿ“ÝL~…óãàâQÚêùieByÚÿÕMy­ïKÝ Œ:ùý‹EúrñÎôÕ‘T¶YÊ})ûÊÑ)uÁ—xþ»ëH_ìf:ð÷*8¾RôUê©’Og￸’~¦›ÊêjéŸvS¹þ)þ~'ÿ$åÂûŸ,Þý£•ôWÒ?æïÀûLýþ»¾’þe7Õ%ÿª›êuÄ8XžgòuÏ=o¨•ûž—zþéy±çÏž×~‰þþmõégéë×èïWéÿÝ|ÓË–²ö>þîyµ”YyT¹ýl7“¥’îҼ泚߾ÖÍÏoýÜ×Ï…ý¼ú‡¤?¨Ê}úw¤?Iåü$_¨ëÕacIÂyó ëLÊëçøv¨ÝÏt³¹ëËÝÌÖø®‡’2¬ÌÙúÿcЫ×3BÓ_ïfsQÏ=þõnÊ«?­‹6z}÷)`úb7/{_Ç÷;íkùÿZ7›;ʤ.úÝnÆÏêØÞž¸?Úµü¦^þt7³zØ?¸ûô!’å€u¬6’°Ë¯Ú ¿·J’GKûËoKý¨XËDYOÞ/q"ÿh/j·~¼›Íå8{™7oK¼¯HòÀ{º™L ›×­êÕ/wó2SÓ­Ôߥ,I‹Ïí•òçø”ù½´ùú±}X{WÏ›=ÿjC=ÊJ½ô~ÆWÚþ¥í[¦ÏéSÝÌ>zŒo· wi'Õé Ý̶øLA+e¹”›Ò¶ø|7ã‹:}> lŸèf²XëÓ¯­‘êyZ˜?Ëx;>\ཟÛþþJz¤›ê‰HêíÝÄû~žtnù'üÝû ÝÔ&éç5çÚ~üI¾}„ú?Ã7½.êçÂ_$õmü ßÿtþ tÑ~S÷”t*K ×U¥±VZÕéòΧ z•óóǺokë}¤›Ùµ&帗ß_? N{\ý3òŸ+òßèæí`õröùn~^V¾Ë5ÑPâŸÕR=—¯–ÆìÌõ$i!—2,M\3~¢HŸìfk×½néyì]à¶çuyÛ¤ý5áõ6Ïç«q Ûgº™ŸáÃÝÌ.{´›Ù^h¬=ÖÓÝ5žópÉó_€†åš¶·‰zh5;Aûü³´×óÞGIòi©>ÜÍæJõòǺÙzÍud¹Nÿ@7[ª›}îü£,”6gÎ'_f\ÿ¶ky®ôè·p<Ò]ŸÎ‡¡³I½V®ÉKz–ëä¡ôX7[‹ÖÉq;¿¾Ÿ1j{|°Èß[$׼ÜéžÕÒZz¾ômhK¨³> í´Óœ»‹µêùRÞ³CKÛÈTúÅ”/vöb9ÖkÆ~L®~Ÿri¿ëóSÏkÇ”í”zªÄµ:ë÷ºÙãIž9F}S¥ïP~ëùæSàY¶íÄr=óݼ¿Ïôûݼ^+ç1íÔÚ§æxj›º^‡|¶›—seDߊ2ÒÛV½>êçï~~éõ_¯{ÿV?Ï« •ú=<è{²µÊÔãñþœKÛÜõ‡6ÜÐ:³Lú'ˤŸo,­KËuI†|_îV·êTËOé§üZÑN͸F?¥m­ ¢M÷Kݼ_á纙>üeRùw_ïW ³Ïû¿ßG›ú´O?=€#“zºžÿųc¯m‡Ú·¬/¾ÔïêîÚÖ×ÿD›’®åüá<]úÞJ[²ä·'xßËP/;¿žJ¿î»y;ï£Å÷¥LÖëÏtkûTJ~©ù]<éKÐ'ÐËU9Gý´ìy ÷GõvùOÿB7óS÷©œ·¥›Í—Ÿ,`îá-÷2ôChk½¯Êõ1é#ÿWÝŒ×jp‰ƒÚv]ÍέߕòúûUª}¥Œ–úTœº¢ÍQûÜ?ÖÍë5yU{Hßc*íFeXÚ•ßëËÑv-}ɶÿ¡nf×iÇ}t iº~V–K¸Äó^VKC¾«Ú_Pò¦vUÍ£ïÖÏôsnT>?Õ­½VòYÔz]yÔß^®Åëo”ßOv3û·çÝ~~ì}¼g%ýÍ•ô7VÒÿ¸’þ»•ôWWÒÿ̳wtÓµu¿îç×w1Þ“zŸÎ5Æj{scsŒ¶K¹×§oDþu_Sû¦Üêy»ç9×-½¼þB•úyD›¬ôc–úX.ç·RoÕ{eÒfx¼›ñŒ¶µ{&å¾o-Ûåz³ô·­ùK;¶œ{ÿ]•êµ³ãÇ=o*k=¼½Œö:·÷{ôþÞ®êyæ—©óén~J8ÇÖtCº©ôI8—Õ{Ðu*éTßãÚùL¹ìõuÏ·ý:ùŒå§»Ù:Öz~÷±Ž1‹v¯¾D×*Ÿîf¾•Cï~½Ôë†_ïfsI¯ûµ|?üR7ÛÓ蟠›Ù—®ñ>ÑÍï‡ÊóŸèæ÷SÕï¦Çx_òtí3.m—ÚoQú…K›§ôå•ü[Æ”²Sîc;çË;}rýà˜ôyhç½|õ²ÛÛƒýþÕÿÑMõÓÃÝTý­•ô¿uÓ}î>õ:ë@ó~=Ðóñ/ÐNi–v|;QúGŇyËñÉn&ãÒú×€»‡õ§÷ïpýcž¹/÷O»Ù^×Ï‘ÿ pÿ³"éf{÷ÿ¼›ù$û~ôEê‡ìq§ïàÑnxnQÇ–¶º{l}^ÏA%¿—|§[ü*›¿ \`«SÝgicH÷–¥¡ts®u~p®Z㕺Cú³]k•ûí¥ý?´ød7¯÷ôµ÷øéåú=Ýl?ÄØ€žßÕÍü¥=È=h×~ÜÖ±1OiÈwZû:W³1´s†â>ÐÍüDåÞ¿>?í›’ôo•²¡o«çݞב1¾zº×UÚCë‰!;­Žùø@ßê_÷žÊý%ǧ¿Ñ1 K¹ôÉ"ïß—ëÀrM_ÎÍCó‰¾ý-µ-Pûô¿\Œ±æë¯t-?®ÇOWêl׺Æ#”¸T¾‡|¥)çjùA›½ôÍÕ¶°ãÓFx¼ ÃGŠvïf:ªŽ?+çšÚ¦®×R*•tú|7Ó#_-hQîéh9|º›ù©?ÙÍÛh¥§½\õ¼;©Ò¯vó6ë×VåšåW»Ù|ÚËb?Oþt7‹á°~.þP7?GšzÙ6FÊ=!} Ú*=¼Cv€<öiÚvnx7§¤o_ÿûg»ùš:C½ž?>ÝÍl²0Æ~vo¯×ÁÚò·üZúT¤¯|­ÍüÛôõµnÞGZ®Ù¬×õœWÎ1u¼¢q~ï­Þ×¼îZÄùY}ìš[ŸPO£O¨Ž[²½Ú_Vú$¿ÖÍôs S9ÿ8/ í Ô¾´¯VýÍiµ}ºÚ¾ÞïUýÕ¸· ëÖrk›~_ŽO8ûvô3êkrèÛê×b}nûGü=¦Wʹ¡ÔqŽY\—kç2^£Ä¥4ÓWRÛ/å^H9•þÿZÏ–ÉØ‘Òç1ä(íKõÀj{Cklãª\Ûº×òo»y¾-㌵m´Gz^ÿõn~]ÖËÔoV©Þ?û­*•kÏtóûä’÷ÏÜó.ùgµ¸ZJÝPú¥ÔkÆZör¬¯òÝ]ÓZë×ÚÞ)u^iwÕq7%ÿ©›Ù_ÎÙ¥M íëõ†ñúùÊùE?¢sŠó£zì#Er«Ö»_+úÓ_ྱú½Ž¹-ûÿ pTÚ¤=?—±îõ|îµ\£k÷ë2cº›ñéjû¤êKùE|—q@e*}¼ÎÅå¾üM×JC:Z™¯÷*-û®Œ™Ó–ìáéù®—»~ï®_÷>ý>Ö¦÷3ösr¿Îí׸ýHŸÞ‡‹ä9m¦OWík«–k;íדÒúI™*÷Íõk»7`RŽê¸?e¨Þ®}ή7ë=¾Ú'SúKÿ»‹1*aGꡒϵ µ¥´ôWê/ÒW÷s$}¸žgéeí±næ+‚­^ï•¶\éÇ©ã€ë8’rNZû•:­LêàZ^K½e×eÏתºåºvhZ]YÂ+,}»¿ÝÍü2c±"î)}¥›ÙúŒ)÷[>FÏw3=Ü˵g,úõV/ëe¬WÙ_íWóù–|nL£ëºþ¼åÿS¥ÿ·Jÿ±Jÿß|º¬›¦Ä‡ ãïvóëzçÑ’¦e\§¾¸2æPßÑ¿,’çˆþ9©·ÁÞɳ>ý³âïÊûŸ$ï“òà>¡ûÆW÷~^÷ºz9Òo¤Ç¤þÓVóDÍsÎÑe,œïßKÙÍÏuÎoÆ–ûKu»uÜ__ƪ•gˆKŸøBûR—*ò‡kÞšnúê9Ù½³r¯°Ç¡|úËÐìg ™û‹½_¯·mú3¼Æìôñ0ýš¾·gŒCìëôvÐ_í¦öÑ_§ü?‘÷Ïþ‡n«ø·h£ê㵕~‚gï¦÷w³sΡå} e|âОQÆöõ7—1Ï¥¬|µ›ŸÖÿ­~)Ï%˜ê=r]Wîµ?®?áÑ*éÒÏR'÷A~­›Åçx®¢·ç=‡¯¾w?þÓÝ|ìIͳµO~r¼ê;÷®Ý“þ¤Ÿ.þîéùºÙ^u_ï—“mëÏo—1Q}]÷ÄÝ Ðvüpñ\Y=Ç–±‹¦r/m•2æµ.×¶ÓçVi§¤wÝ÷ C0j×–õÊùÎ>êÞî.÷ŸŒ»í“<>¶oW¦r?¨ô_¯•Œ,÷KÛpÈ—ý‡ÝüšÃýÚ†ªýò⤌Á(c=Ý?R×vxIkí‘zí£ Xî]¸oSΗ¿ÑÍìºÚÖ,mWû¨ÏKÛroBß_i;ùpjßÜPÚ,ý[¥ž*ÏvyîÀTß‹PúŒgýt7'þé¢NÓéž¡ñB¥¯©ÔKÒU’ú³×½Q§ôº§·5zõÞnv×uýßåïßèæï£‹²£Jj¹ï>´–©mäÚ–­× õ»g¯z÷þMã{ýßϿȸ{ÿN?§ö÷Hé{P/÷zöýÝÌ7`œÑ»¨£èýÝ,öëkÝl=TÞ‹á|XîÇú¬<¯3–Ê3Àî Ëcçe¥ÓjñDCñxå:£Nµž«ã2ëØÒÒÖ*ÿ.ŸÕgÏj?U½&Ú?,cBÆ|ÒÎsuÌ÷Ø^VcXÊT c©Ë=É!÷çª÷eªçŒrîj¯ô7”¾’!Y,÷2ÿ]7¯ÿÆö·Ê1—kõõúJ¼˜Ô—®=K_ü྅çÚ=Û£ßJ»ªÿ»ômi×îž\9–¼QïaývÑžq4½¬÷6~¯ûz™ïud¯ ÿû•ôönz¦è¯uSûÞ³ìfñ&Úäåü5¦+ËØùk¬Îjñšõ¥4¨í§Ò¨n·ÎËïïfqƒåY6ç,“mÕñƺô©_ß¿§›!жÕ£êò>ýånvR_CoýþîqÔûüô%õòÚë6Ϥ{ŽççIýó^–{Þÿ`7»7å“ÝlŸ©Þ·ÿ\õw)cõzolΫq;æóÖWùG]î°ížCú¾•ôü•tíJºa%í(Ò ¤kŠºÖ>ÏM×隢ÎP²ï,Ò•¤çt-lÂq]ÕÏPŸWŽ´U¶¹Ú8ʱ\Wômÿ¦18Ö“Æ`«Çýê~ç:’p óî•tË@*éÜ×9Àß× Ðd, ÁZã¯Ä]Ù×ëVÒWÒ=+éôJú1ò“<ÿaê •°ïI;VIcõoèZÚž å7yi '%.Ê÷¾+ñs c>ÄÅP:Ráh5\”¼p`$íîÆeýº>ÆäAx~7ŒqQòDMÛ!¾­qr¤H5ŸØ^Içš¾%,CzOTëŒ!z—:çldgLîk}Tât­´^8¯è·L×€Ÿ’NGÀ/§½¼ž^%ýØ:Òjß÷éž*Õ:âH×òÁO—éÚn^k~,yÐvJÞsüÂQÖ©á¨enLNkY’WÕÉ«ñÌm×£ÇÏ& ñK­ÃÆR-cü}M7<—(¯«µ+﯆“1þ_Ï÷Ž¥ó±k×#/õ¼£ïdÈ^µÞÏ•ú ¤AM×1[u-½±ýÇìwåqµùºì³„³î·„¹Ô15ýwtót®ù÷\Ö+eŸCs[=ž1ùZwÔ<\Ï;µN¬çò¡µìjü>&ÿ5ŸÍëC~ÌÚn«uá˜-»ÞTâth¾[/¿ŽÙ¿«ùokþ¬û“©!Û¤œë†æ›³MÚe·t3¹»¥›çýµR-Ã7TãÓq%_Û¯>Ùr]pdàÙUðdÚÝÍÛœ%­Ç§:´¶ãÑ!]X® ÆÖˆC8³Ñ†ø Ä¼ÐËso·÷>€¿B^Ú>?\Õ?I¾–¿¶î«N?<|·£›ùEÖ²aÏÆNŸCë¥1;wŒFׯ毯ý×þ]έµ¾òa–8Ãkm{ÔkêÕì–RŽÇücxóùÆtT‰'Ǥ<^×ëÞzÒ­«ÉëЭÜó¨éRÃ_®™]G”2õ×VÒß$ý/¤þÙCÝLÞJݪïwhþ\m¾[ÍN,¿«×ÿëÙ?ªý(C~•ÒΚ³k»°¶ÓÆì¡u¶ôî!ˆ~õÒ×༮Þú+$ýyú›ôåÝ3@ç’¾µý³–½ÚuÌ~õì_êæý‘Ê—ð–~3¿­÷ë†öèÊ9{hÿ½^'®f3>¿çƒzZ˯8$ŸuüA™Æü¿C{Úå¸×ãwÓåwcvêØ:5;÷ù´[òF½ßîþ–|­m+ÜÓ Ï·õúrl]9¶F³‡|¾õ^ÆPŒÇ˜yÈÎV.äåÒ¦ÚçZMÿ¬¦ÿv ô]ëܱ½šzoHO¬6Ç•p¯¶Þ›?‡ìëµüêµ1¿Öj6i™®©Úš§×ò™ Í͵|®æ7ò•–}Ëó5Ÿ¯¶/²Ö¾ÉÙ¤º­Úž,÷Óêz5”¾¥kºa(í4}CûQu´‡3æ [“”ïK<ÔÉ=¼õìÔzË~Æ|o瓞ÓÍëÌ’æÒsÈF¢±x(å¡ÞÇü¦*­G'ÑwÈÿ<‡WÊe­—ê5çj¶ÎZ8ƒ¥žÇkÙ¬çñ±5n ÉOc¾ìÒ[îÔûÓcöèPœÊÐ^mm Åš­å'\‹ê1ÕvN¹_¯{†Öšcñ¦µ/a-øj_ ݼ~¨ýØâ¤öG–¸«íÊÕÖÖ[í¯ÜK¢¡I^š†Æ_ï•öZí/,×~êñÕÖÈ%Ï—ý­æç³»Jº¬×ÖY¯Ý8ömM{×ùâõÏP ÎÉnXk»ü𮵇ք%¬¶NÂå}²Z,´t[ ¯csþZ8òŽù ‡èweõwkSÎÕ«­+WÛãYËg9¤?j¿þ˜©loLfVãáZ×Õ¸YË'Vã½´†æùÕÒjøZÛ–û€îÓ Í·µ]SŽ¡ÆéOÕ¶ÜZþ¡¹xŒÆåÜU¯Uʸß:½±›÷ãÑ£öù¸n\o‡øD½14ÉØÐÞÅïiµxØR§¬%×c¸ê¿äõèœ1ý¿ÚwcöBýã²y†xF¾¹¶kq=ËØœzM×Òhˆ6¥ý$Oº7âütC7ï“X cþ«!]¾Ÿ­F‡!}9Æÿc: ô_­÷ÜÂÿÙÅî—®gcH–ó´zäÿoïMƒ,KÓû®^fäééé‘lá…Õ†°q¶<÷YÎ"³xöééV¬¶hÝš.+»ª¨¥¥0 cd[`ŒÂ`›MØ›ÅD8‚úà„…l‚pÀEHdUÝ÷ùÿÎ[73ofÞ\ªº?<Yo½çã÷¼Û†Á›Ø°m†Ù†§½Îù\éç¶ß³øýËIûÔ?¯ù¬hωÞYäwgü7o+DZu›ïOún÷¨¬ÒÃ>çu}uMoʽóÕ~wÙÜÄßþÜòû‰– Ëç½wÓÿž²ç9OÚ_;'åÁm¿ËÝæs=¿ƒhü9nÿú³E6ç80§ðºéßiõ\ä÷ž<®íû½žO›žGqà¨Lr\Ölן“ýý¸‰›>»0ÿÇiþ~†ŸûNº¯úmþ»q.Úyá1å9å¹y˜[ZÆ¡Óν‡ß½®¯c¼ÏI­6eT^CíóÀI¹ñ¸ÏS'Ý/‡oòvùoùþõœ£~?Ð_÷=øŒáç¿MÿîŸÿžƒ×ïñþþ¦'Þ~Ýg»M¿—é×°é;³VÜþþ÷ÝGe.Û£rßQà×oè½iŽû›óx^6}WÀkø¯zîÉk¯Ï,›øuRm›{NÊ­'=Çúc~ÜzúýØtŸõ÷è6ŸùOÊ„Ì^üœÕrÖØíË&†÷ûÁ~í:èuÜg–ã²Ü69í¤s}Ôw;ýµÝÿþŠëýõÏm¾'xŽÈªM9…ç–¿›jžH{ÿDó ™[þkó6}gÖ&cæ÷ÇÕQß{õùŒ^"]Õæù7æößGôßAlúýXË ­úwlû¹÷¤ïæz·eÓ¿'9n~—|Üç¤M×n»_yŰ“î~>î»àžÏGeóãØxÔrÜ&n÷6Ÿ‡û}ãõÏgàIŸ…ùü;îûðãrܱ;ÍçüÓ|æ?îs×IËõ×Õ¦l²‰‡ý³‚ÞJËUô£ùý–¡ÿ¦Ïp'ñ‘Îɦ¯ÙrüÃCÔr:ßÝsÖïÑ7]s§=Ÿ'ƒM¿ ÚäPÒjÇø8ölúþ°ÿŒuãŽÊ™}¶>é{Û¶}&>MþÚæûn¿Óå>’ÕGù䛾í÷©ÿB;N›ŽõqüØ–Ý›®»M÷ʦçÓ¦ëà¨ï6ObyŸ%ûcÖ>_ñYÞîɇÿÆŸŸ7}÷Ò¾£è?oú.µÿ}[ÿy¯í?3@Ý´k«e¢MÏ[^GöÜrûúctÜ}Îëóá5ôCëãò‡Ÿ[朾ø}CûBÿ¹šŸEÛ÷¥mnû¾”×icá¦ýÝ” úk§†n{mÃË_Y¿ÃöÅu}¤«P8÷ùKª£¶í¤â²GÕi×yž:iÿNÚÆ“æ·_/QGýý¶=ûíßæ8µ-WYç=‡ÇÓ£ÖuÚsuUÇd›m<ï½q™ûtu>OsožõÞE·ïU_“ç©ãÎíuÚÏÓ²æ*ê¤ëe›ýÛ53Nâõ.ï½ÓžÏ£òÒyî÷Ólûi®»]íóYtžÌwžuíò>=Í5µi›w‘…/šOGÝg»ÊG'ÝçÇå§“æôswýœ¾ÊçÇiÏ实»Ì8Û^—q|¶Ù³›Óòí¬L½ìgÞ®®Çã¶o× ãq<ÍyÍ9?é:=*§œö<ªN:›öï¢Y}Öóý,<·eÈ®9Ú_W»¸_ϺבßG]ƒç½æÏ{ìNºwÅÙÖ¯¿F.›±gáÂ6Ï­£öeW|Ûõ3l›c½iû/âù{Ñü½(æŸç>¸H¦_vÿó³^Ū]Ý;u\w‘‡.c›Ï³ŸgáÌi®ƒón箞ÃgeÇQljÛqžLwL8/‡Ïº­q/ìŠ{»<æçÉLJžÁçaÌI}»vú{½_çYÎÏi·o›}?j»ÏÂñ]Ö¶÷å6Çí< ¼è"+/ó³Õ¶Çì¤ssÚýÜv]œ{ÔgšãjŸk6õÛf_O›w6mó¶çâ¤ÚåqØUmÃõm¯Íóri[öžæ~9êïvqŒŽº¾Ï»?g¹f/ƒù ºèçÁi¹zÞs¸Mÿó<ßw}œ¶y&œ¶×i9²-û·9®»Î6—qÍn{-œ&¯œö:ÝÕ=tFo»ÜY™}.‡ »|¦w ϺÜYï‡]g“®É]>«O{_Õ³ë¼×D;O'mçYÏÑE2å¸}ÚÅýr–ûø´×ÁIüÙÕ5zÚc°‹lpÞû{›Ú[¶É›j›L{Òq>ϵzÔ9Û´ýý¶žæüuǧ=ç§­óÜÏý¼¹¨c~ÖçÍe=ƒwÁ¿‹|žuN®‚×Û\ÏÇÝëÛ\Û^+gaç_Æ3ï"˜tžã·‹ã~÷C¿ÇmóEò±¿FŽ:ÞÛ<ÏOËÖÓœƒ‹bÍ®®Ýóž§³lËißQ?Ÿæm»OWʼnÓlëiïñþz¾Ìk÷¨{ì¸íØ´]\ßqÛ~ÒýÛ_G§áíEßß§©ë1Ž9Ö9ÜÆ~áðçoZÏ}é°^ùü÷ß»³wïέÛ7ÞÞ;X¾ô¥ûwîþùæþzà›¿s=áW}nÿöý»woܺ¹þ«OÖ_}õÞ­;ï=nóbkóüzÖ7|ÏÞÛ‡}øÓÏ?lÚ½L÷¨“ùÑ®¾¡«_ÔÕǺz©«þ?ˆxù¹å €uW¿¦«¿¹«_ÛU{AößÚÕßÖÕ¯ëªáö·tõºúTW«®ú—©{WqXßzX¿±«þåâGWgWWW§ÿ›ºútWŸé골Ïwõ…®¾ØÕ—ºzµ«/wÕ¿$þõ®¾­«7ºúJWßÞÕoîê;ºújWßÙUÿ’íßrŠý>˺Y¿µ«ïêêïéªÿQÿÞ®þ¾®¾ûšoëïïªÿgÿÁ®öºz««·QµÿWylžÆóð°Þéj¿«ïéêk]½»¡ntõÛºúÞ®ºz¯«›]ÝêêvWÿPWwºêÿ#Ê{]Ýïêý®¾¯«þ?¨|ÐÕtõwuëüGºúí]ý£]ý`W¿£«¬«ë¸gÙBõ~XÿxWÿDW?ÜÕ?ÙÕ×»ú§ºú§»ú]ý3]õÿ1æ?×Õtõ»ºŸYÿ|W¿»«¡«=¬ßÛÕïëêǺú»ú—ºúý]ýË]ýÃúŇõKºúæ®úÿ@è—võ˺úåÏ=ùeì*'·ú[ºº¨ü<<÷ä 2u5wõ­]]t†»¨õ>K郲ŸgÉ W±Ï×5c5_]U¾á3þ¼Ïè«z&µ®Ë|ŽŸ÷ÙÍú=]mó\ÿ××õǺúã]ý‰®þ®þÍ®þ­®þí®þ®~¼«·«?ÙÕŸêêßëªýY¿²«_ÕÕߨÕßÔÕà qšçýYŸûùý+»º:Mæ¸ÎŸY/ûóê.xî•ývý}éEæÈ‹ÎAWµ}×9{ç^jëù }Çó0‡üþsìßuÛÿë|¬Ïó½ÒemóEdÞ«È€»þn‡õ¯tõ»úC]ýá®þHWÿjW§Í…?ÑÕ¿ßÕŸîêÏtõtõ¢þŽö]½ÒÕ'»úÆ®¾©«_ÜÕÃïÉ.ëwt—Ñã²¾ù ÿ²«}Ú³úu؆ó>ûO»ž«ú½ÅU'rÞçÛuþ^ä7=w:åa}®«½”Í\ÜfÛ¯b·}v\s/›“×ÃÛ|ÆxÖ>_]öö\µƒpV—ⴿ߸¨ß1œå9{‘+ë2>+õ~Á.|Î㞥×á9wÙŸ½ž…ï4Ïòü»®ÛuÒóïiøüsYÏÍ‹àû¶Ëìò÷Ùçý~ï:|÷wÚùçùýðE~ø°þ£®þã®výo)výùï,Ë_ôwa»~Î\Ôsç2Ÿçáøuû^k<ßf;Ÿ†ß5^¶û½KëY;žá)³~EWuWMW-ê¯Cýõ]ý ]mãB=-~ôo8bì:;SÛ~6|~ßÔ?ûN»±MOãgÌÓ>{/‚§×Çõ|;Ëç§Ëö!ÎêB_‡³tÕ®óy<—ö¹íÏvõŸtõçºúO»úϺÚfÎÞÕO®ë¢ÿÝúgϱÜUü®qWëÚæ÷—Oëï8·ÙæšsÒsþ2÷ó¼}®ÃñºŽ¹hßI7íê{ø£¾‹?ëï–ŸÆï¢ÿë®~º«ÿ¦«¿ØÕÏtõßvõ—ºúïºúÙe½øÊï°½Šêá]Tï_ÇêÇ¿‹ê?^dõŸ›>¬'?sUýçëXýg’bõŸvUýç„ˬþóÀµúÏ9ÖÉÕFzªÿÌrªÿ\tÚê?=+Õ¾;OõŸ›.£úßÝìªúßù<­Õ;Xg©þ³Û®«ÿì÷a=Y½Óöa©þµ+¨þ»þ§½úß^Eõ¿[|ZªÿýW«ÿâTþ­ÿ}‡õW¶¨Ÿ;gý¿O_=ÿÑ«êc;¨_v†ú®Kª·ŸâúÚ)ë`Gu÷Ô︀úáxýÈë÷]³ú±g´þà%Õ¿€úSÖ©êO_£ú©KªŸ¾¤úKÏPýOðú_wTå)¯Ÿ{êÿ;]½ðâÕËW\¿äœõ˯qýÆëÂês[Ôë[ÔWw\ß½eí]A}ï%×í§¤¾ï«¼äúá+®ßyIõ£T?v†úñg¸~â‚ëÏ^qý—WP?õ­¿ð”Ö_| ê/_RýoPÿç–õÿì°~á|õâ7\ƒzå”õOqýšׯÝqùê[/¸þö×g/¨~ó%Öwœ£¾û¬·¶¨ßöa]hÝzÆê÷^ãú;®?úÕ{ÊêOnY?ñ ÖOž²þüÔO}ê§/ ~æR?ûÔÿqÆú¿>¬sÕÿ}Aõsg¯|ä꟢úæK¬_ñ”֯ܢ~݇µ¨O]b}ë9ë3Ö…Õg?àõå§¼¾ó®7OYoPï^ãúþ-ë.°~pGõCGÔׯ°~ä)©ßõ ×>Eõ{ž¢úC×´þÈ5¨?ºEý‰§´~ü¯?³¡þÜÖO^RýWÏPý…+¨Ÿù°õ³—\ÿý5©ÿáœõ?žPÿóëy ë/_ý®Ë­¼ðØñzø.Õ‡~ôy|âÓoíß¹wë[Vóœë±—>}°ÿý8œtpãî­›ûø§n¿»Ç‘}úæâÏ/úÎÁþÍýnèÞ»÷ï,Öó™½;w,&}æpƒ–«þøáЃƒÅ6~fÿÞÞràÆÁÁr5·nÞ¼±¿œsgÿÞb½ŸÝ¿»·ØœO|öݽ›÷öú±Ã]y°\òÝ;7î.GnÜ|g1瓟=Ø»ÿÎþ½{ûËÑÃïÝzkÙã•ÏínìÁÁbêÇo.VùÒçö÷–§ásûo½õ 9Xš—?·x$–û¹[Ë5þp{ýùwnÝß»óÎb±Ï¿wc¹Ø'>ûîƒîÒøüß»<9‡#7—‹Ý¹¹wyÙ½ü…½·n,÷îc_Ø[îÛön,.ÍW¾ppëÎþÍ·—ÇípðÁbÃ_úÂåš?ñpàíý»ËuŽ}ïÁrK?ùŽ·îÜ“ݤ{ÝMòí{ot#û÷öOžW¾ýÝÃswûö²ÿwÜX²üßqëûû[à“_Ýë>7ºKõ«÷º«ù;™õ ¹ù`y¥þ–=Këƒ%é^z³{ô2C mR˃&U†hcÊm¤eˆögd µ Që© Q“”!4©eˆÚÆ–!4°ÎZMeÍYgˆZoeˆÚUd޵ ¡%[†ÐH»ÚÈ2Ch”¢.2D­²2DíAËšÒ2F–‡B“Z†¨5· Q{ Q‹U†Ð,eÍjB+_g-¦ Q›© Q—Ô:CÔš+CÔqc†Ð´–!jZ†¨ @†Ðº!êt-2Du¨ Q[¯ Q=!jCZ†Ðr•!´ò–!4©2DMª Q“”!4´ß߂ʵ™Èu(˜!4ˆ Që« Q»øjgT†¨íR†¨­@†ÐšÞ_ž5dˆZyeˆZªeˆ:…‹ ¡[†Ð‚÷»›«2DMy­»K*CÔ~ Ch=-Ch±ÝõzÁ–!4c¿ƒ2D­·e Ü]l 3„&ÝïÎXeŽÜX®c•!4¦ QW3„ZôU†¨]V†¨£;‹ ¡+ChÁ[Ë­B†¨9-Chàv÷p@†Ð¤{ÝMRB#-CÔf3CÔšZ†¨vÈu}/2D-Ú2Dµ¬ ‘u†¨‘Ê5R¢Vüf÷èe†Û¤–!FMª ÑÆ”!ÚHËíÏÈj¢ÖS¢&)ChR˵-Ch`!´šÊš³ÎµÞʵ«ÈkBK¶ ¡‘v ´‘e†Ð(3D]dˆZeeˆÚƒ–!4¥eŒ, 2„&µ Qkn¢ö¢« ¡YÊšÕ2„V¾ÎZL¢6S¢.©u†¨5W†¨ãÆ ¡i-CÔ´ Q€ ¡u!CÔéZdˆêP¢¶^¢z CÔ†´ ¡å*Chå-ChReˆšT¢&)Chh¿¿•!j3‘!êP0Ch¢ÖW¢vñÕþΨ QÛ¥ Q[ ¡5½¿Õ&=ʨ ±u†ÀÈ£ ?· ±z”!¸žÇ‚“Öb1éQ†à6>Ê‹‡b±šÇb1ça†àzgîjËÝØ£ ±XòQ†XŒ<º0‚ ±­ Qe®òq†à<Ê‹)2Ärä`yhZ†XLz”!¸æG‚{Ý2{œ!³Öb1ëQ†X¬üa†X,¶ÎÜÌu†à%õ0CpÍ3[eˆÅ´G‚ð(CpZ†X¬«ež.evxœ!¸õë Á-CpCeˆÅr3Äbå2ÄbÒã ÁI3'­3Äbh¿¿×‚›Ù2EeˆÅ`Ë\ßã Á]|µ¿3gn×:Cp+Z†X¬éýåYk‚+œ!¸Ô£ ÁS¨ ±XðQ†X,x¿»¹gNy­»KgîGË‹õ<Ê‹ÅtÔë=eˆÅŒý-Cp½2Äràîb[*C,&ÝïÎØã ÑÜX®¨eˆåØã ±[g^I•!-z€®3wy!¸ñotg@b±àã ±XðÖr«Z†àœGb1p»{8´ ±˜t¯»IgˆÅÈ£ ÁÍ® Á5=Êl×2¯oe.ú(C°åã ±y˜!8ò8Cpäq†àŠßì½Ì«6©eˆ•&U†hcÊm¤eˆögd µ Që© Q“”!4©eˆÚÆ–!4°ÎZMeÍYgˆZoeˆÚUd޵ ¡%[†ÐH»ÚÈ2Ch”¢.2D­²2DíAËšÒ2F–‡B“Z†¨5· Q{ Q‹U†Ð,eÍjB+_g-¦ Q›© Q—Ô:CÔš+CÔqc†Ð´–!jZ†¨ @†Ðº!êt-2Du¨ Q[¯ Q=!jCZ†Ðr•!´ò–!4©2DMª Q“”!4´ß߂ʵ™Èu(˜!4ˆ Që« Q»øjgT†¨íR†¨­@†ÐšÞ_ž5dˆZyeˆZªeˆ:…‹ ¡[†Ð‚÷»›«2DMy­»K*CÔ~ Ch=-Ch±ÝõzÁ–!4c¿ƒ2D­·e Ü]l 3„&ÝïÎXeŽÜX®c•!4¦ QW3„ZôU†¨]V†¨£;‹ ¡+ChÁ[Ë­B†¨9-Chàv÷p@†Ð¤{ÝMRB#-CÔf3CÔšZ†¨vÈu}/2D-Ú2Dµ¬ ‘u†¨‘Ê5R¢Vüf÷èe†°6©eÓ¤ÊmL¢´ ÑþŒ ¡–!j=•!j’2„&µ QÛØ2„ÖB«© ¡9ë Që­ Q»Š Á±–!´dËi·@Yf2C´ÑE†¨UV†¨=hBSZ†ÀÈÁòÐ ChR˵æ–!j¯‘!j±Ê𥠡Y-Chåë ¡Å”!j3•!ê’ZgˆZseˆ:nÌšÖ2Dm@˵ÈZ2D®E†¨•!jë•!ª2DmHËZ®2„VÞ2„&U†¨I•!j’2„†öû[P¢6¢3„‘!j}•!j_íïŒÊµ]ʵÈZÓû˳† Q+¯ QKµ Q§p‘!´`ËZð~wsU†¨)¯uwIeˆÚd­§e-ö » ^ï1Ø2„fìw0@†¨õ¶ »‹ma†Ð¤ûÝ« Á‘Ë!C`¬2„Æ”!êJb†P‹ ÊµËʵñotg`‘!´`e-xk¹UÈ5§e ÜîÈšt¯»I*Ch¤eˆÚlfˆZSËÕ¢®ïE†¨E[†¨–•!0²Î5R¢F*CÔŠßì½ÌÞ&µ ášT¢)C´‘–!ÚŸ‘!0Ô2D­§2DMR†Ð¤–!j[†ÐÀ:Ch5•!4g!j½•!jW‘!8Ö2„–lB#íh#Ë ¡Qfˆ6ºÈµÊʵ-ChJË9XdMj¢ÖÜ2Dí52D-VB³”!4«e­|!´˜2Dm¦2D]Rë Qk® QÇBÓZ†¨ h¢6BëB†¨ÓµÈÕ¡2Dm½2Dõ@†¨ iBËU†ÐÊ[†Ð¤Ê5©2DMR†ÐÐ~ *CÔf"CÔ¡`†Ð 2D­¯2Díâ«ýQ¢¶K¢¶BkzyÖ!jå•!j©–!ê.2„lB Þïn®Ê5åµî.© Qû ¡õ´ ¡ÅtÔë=[†ÐŒýȵޖ!0pw±-Ìšt¿;c•!8rc¹"dŒU†Ð˜2D]IÌjÑT¢vY¢6þî ,2„¬ ¡o-· ¢æ´ ¡ÛÝÃB“îu7Ie´ Q›Í Qkj¢Ú!CÔõ½ÈµhËÕ²2FÖ¢F*CÔHeˆZñ›Ý£—"Ú¤–!B“*C´1eˆ6Ò2Dû32†Z†¨õT†¨IÊšÔ2DmcËXg­¦2„æ¬3D­·2Dí*2ÇZ†Ð’-Ch¤Ýmd™!4Ê ÑF¢VY¢ö eMi#ËCƒ ¡I-CÔš[†¨½F†¨Å*Ch–2„fµ ¡•¯3„S†¨ÍT†¨Kj!jÍ•!ê¸1ChZ˵-CÔ Ch]Èuº¢:T†¨­W†¨Èµ!-Ch¹ÊZyËšT¢&U†¨IÊÚïoAeˆÚLdˆ:ÌD†¨õU†¨]|µ¿3*CÔv)CÔV ChMï/Ï2D­¼2D-Õ2DÂE†Ð‚-ChÁûÝÍU¢¦¼ÖÝ%•!j?!´ž–!´Øƒî‚z½Ç`Ëš±ßÁ¢ÖÛ2î.¶…B“îwg¬2Gn,W„ ±ÊS†¨+‰B-z€*CÔ.+CÔÆ¿ÑE†Ð‚•!´à­åV!CÔœ–!4p»{8 ChÒ½î&© ¡‘–!j³™!jM-CT;dˆº¾¢m¢ZV†ÀÈ:CÔHeˆ© Q+~³{ô2C,ßS‰fˆî=•i¢Oår¨eˆî=•œ¤ ѽ§’ÛØ2Äò=•‹ÕT†X¾§’ë­ ñÄ{*»±–!º÷T.FÚ-°á=•‹Qfˆ'ßSÉUV†X¾§r1¥eˆî=•<ÊÝ{*¹æ–!žxO%« ñÄ{*³Z†X¾§r±˜2DÿžJ^Rë ѽ§’Ç¢{O%7 eˆ'ÞS¹X2Ć÷T²Ceˆþ=•ì ±|Oåb¹ÊÝ{*“*Ctï©ä$eˆþ=•‹åZ†xâ=•<ÌO¾§’ë« ±|OåbJËý{*¹ÈË÷Tr9eˆî=•\ªeˆ ï©\,Ø2Äò=•œRbùžÊåÀòöf†èÞS¹XìAwA½Þc°eˆî=•<ÊË÷T.î.¶…bùžJöª ѽ§’+B†xâ=•‹1eˆ'ßS¹hÑT¢O%7þî ,2DÿžÊÅ‚·–[… ±|Oåbàv÷p@†X¾§’;R¢{O%7›bùžJ¶C†ØðžJ.Ú2D÷žÊåÈ:Ctï©äHeˆå{*—ñ °°|O%˜!º÷Tb¤eˆþ=•Ë¡–!º÷Tr’2D÷žJncËË÷T.VSbùžJ®·2Äï©ìÆZ†èÞS¹i·À†÷T.F™!ž|O%WYbùžÊÅ”–!º÷TòH(Ctï©äš[†xâ=•\¬2Äï©\ÌjbùžÊÅbÊý{*yI­3D÷žJ7fˆî=•Ü€–!žxOåb]ÈÞSÉ•!ú÷T²2Äò=•‹å*Ctï©\Lª ѽ§’“”!ú÷T.–kâ‰÷TòP0C<ùžJ®¯2Äò=•‹)-Côï©äV C,ßSÉå”!º÷Tr©–!6¼§r±`ËË÷TrJeˆå{*—ËÛ›¢{Oåb±ÝõzÁ–!º÷Tòh(C,ßS¹¸»Øfˆå{*Ù«2D÷žJ®â‰÷T.Æ”!ž|Oå¢EPeˆþ=•Üø7º3°Èý{* ÞZn2Äò=•‹ÛÝÃbùžJîHeˆî=•Ülfˆå{*ÙbÃ{*¹hËÝ{*—#ë ѽ§’#•!–ï©|<ððÿÏxqýÿg<÷üzÂ7|ÏÞÛ÷nÝ9üéçÏxø7ßôðo>zsï½ý»ëéŸXOÿÈÃÁöóƒý½;ëŸ?úÞ­›÷Þ]ÿáÅwö´9ïÞºßæ|ì`ïÞ{‡Ù¶m‡¢¯qàc·ïìß½{ÿN5ø¾Ã‹¬ý|ïÁí6þ‹îîïÝUn¼ÓmúKwn}ß·`ó鯧>ßÔÒç›ò|û%Ïó훚ç[Üz¾ÄçÛ ºžooÙx¾ýSÙVŸªŸVõ“ÕO^?Eý”õÓP?õÓT?U«V=¬zXõ°êaÕê‡U«V=¼zxõðêáÕë‡W¯^=¼zxõˆêÕ#ªGT¨Q=¢zDõˆêÕ#«GV¬Y=²zdõÈê‘Õ#«GV¡z Õc¨CõªÇP=†ê1T¡z Õc¬cõ«ÇX=Æê1V±zŒÕc¬cõ˜ªÇT=¦ê1U©zLÕcªSõ˜ªÇT=æê1W¹zÌÕc®õZþêåº/Ô+ò^¨ݼPÿ\ýÅUý«³ÃWúÑô£ëÇЩý8êÇI?ªÛJÝVê¶R·•º­Ôm¥n+u[©ÛJÝVêfêfêfêfêfêfêfêfêfêfêæêæêæêæêæêæêæêæêæêæêêêêêêêêêêê–ê–ê–ê–ê–ê–ê–ê–ê–ê–ê6¨Û nƒº ê6¨Û nƒº ê6¨Û n£ºê6ªÛ¨n£ºê6ªÛ¨n£ºê6©Û¤n“ºMê6©Û¤n“ºMê6©Û¤n³ºÍê6«Û¬n³ºÍê6«Û¬n³º‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%&–˜Xbb‰‰%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%.–¸Xâb‰‹%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%!–„XbIˆ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%)–¤X’bIŠ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%ƒX2ˆ%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%£X2Š%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%“X2‰%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%³X2‹%ú_à_Ôæú¢þO¶õ_«|d¥W¤?üy…Ÿ ?;~üœøyÀÏ#~žð3ú®Ðw…¾+ô]¡ï }Wè»Bßú®Ðw…¾†¾†¾†¾†¾†¾†¾†¾†¾†¾†¾Ž¾Ž¾Ž¾Ž¾Ž¾Ž¾Ž¾Ž¾Ž¾Ž¾¾¾¾¾¾¾¾¾¾¾‰¾‰¾‰¾‰¾‰¾‰¾‰¾‰¾‰¾‰¾úè; ï€¾úè; ï€¾úè;¢ïˆ¾#úŽè;¢ïˆ¾#úŽè;¢ïˆ¾úNè;¡ï„¾úNè;¡ï„¾úNè;£ïŒ¾3úÎè;£ïŒ¾3úÎè;£/xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW+ðj^­À«xµ¯VàÕ ¼ZW^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^xeà•W^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^9xåà•ƒW^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W^xàU€W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚W ^%x•àU‚Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€Wx5€W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚W#x5‚Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5Wx5W3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x5ƒW3x¿Ýà·üvƒßnðÛ ~;þ«‹àÖñó„ŸÑw…¾+ô]¡ï }Wè»Bßú®Ðw…¾+ô5ô5ô5ô5ô5ô5ô5ô5ô5ô5ôuôuôuôuôuôuôuôuôuôuô ô ô ô ô ô ô ô ô ô ôMôMôMôMôMôMôMôMôMôMôÐw@ß}ôÐw@ß}ôÐw@ß}GôÑwDß}GôÑwDß}GôÐwBß }'ôÐwBß }'ôÐwBß}gôÑwFß}gôÑwFß}Á+øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üvƒßnðÛ ~»Áo7øí¿Ýà·üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üv‡ßîðÛ~»Ãowøí¿Ýá·;üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö€ßðÛ~{Àoøí¿=à·üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·'üö„ßžðÛ~{ÂoOøí ¿=á·ç#¿ý#/<÷Ü‹¿pøço:¬ç×÷ñwöîí}Ë÷ÜÙ{oÿðO?ÿ°þT4™-*rggobi/R/0000755000175100001440000000000012761400711011741 5ustar hornikusersrggobi/R/display-modes.r0000644000175100001440000000516212325763563014717 0ustar hornikusers# Projection mode # Functions to get and set projection mode # # In GGobi, the projection mode determines the type # of plot that is displayed. For example, a 1D ASH plot, # or a 2D tour. # # You can see the list of available projection modes # using the \code{\link{pmodes}} function. This accepts # either a GGobiDisplay, or the name of the display type. # # @arguments GGobiDisplay object # @keyword dynamic # @alias pmode<- #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X pmode(d) #X pmodes(d) #X pmode(d) <- "1D Plot" pmode <- function(x) .GGobiCall("getPModeName", x) "pmode<-" <- function(x, value) { value <- match.arg(value, pmodes(x)) .GGobiCall("setPMode", as.character(value), x) x } # Interaction mode # Functions to get and set interaction mode # # In GGobi, the interaction mode determines the how # you interact with a plot: brushing, identify etc. # Each projection mode also has a default interaction # mode that allows you to select variables and control # other parameters of the display # # You can see the list of available interaction modes # using the \code{\link{imodes}} function. This accepts # either a GGobiDisplay, or the name of the display type. # # @arguments GGobiDisplay object # @keyword dynamic # @alias imode<- #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X imode(d) #X imodes(d) #X imode(d) <- "Brush" imode <- function(x) .GGobiCall("getIModeName", x) "imode<-" <- function(x, value) { value <- match.arg(value, imodes(x)) .GGobiCall("setIMode", as.character(value), x) x } # List available projection/interaction modes # These generic methods retrieves possible projection/interaction modes. # # The default methods retrieve a list modes for all display types, # the character methods retrieve modes for a given display type, and # the GGobiDisplay methods return possible modes for a given display # # @alias imodes # @alias pmodes.default # @alias pmodes.GGobiDisplay # @alias imodes.GGobiDisplay # @alias pmodes.character # @alias imodes.character # @keyword internal pmodes <- function(x=NULL) UseMethod("pmodes", x) pmodes.default <- function(x) { types <- ggobi_display_types() modes <- lapply(types, pmodes) unlist(unname(mapply( function(modes, type) { all <- append(modes, type) lookup <- rep(type, length=length(all)) names(lookup) <- all lookup }, modes, names(modes), SIMPLIFY=FALSE ))) } pmodes.GGobiDisplay <- function(x) pmodes(class(x)[1]) pmodes.character <- function(x) .GGobiCall("getPModeNames", x) imodes <- function(x) UseMethod("imodes", x) imodes.GGobiDisplay <- function(x) imodes(class(x)[1]) imodes.character <- function(x) .GGobiCall("getIModeNames", x) rggobi/R/display-tour.r0000644000175100001440000000371312325763563014601 0ustar hornikusers# Get tour projection # Get the tour projection from a GGobi tour. # # This function retrieves the current projection matrix # from a paused tour. (The tour must be paused so that R # can run commands). # # This can be used to record interesting projections of your # data for later analysis. # # @arguments GGobiDisplay object running tour # @keyword dynamic #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X \dontrun{ #X pmode(d) <- "2D Tour" #X ggobi_display_get_tour_projection(d) #X variables(d) <- list(X=names(mtcars)) #X ggobi_display_get_tour_projection(d) #X MASS::eqscplot(as.matrix(mtcars) \%*\% ggobi_display_get_tour_projection(d)) #X } ggobi_display_get_tour_projection <- function(gd) { mat <- .GGobiCall("getTourProjection", gd, pmode(gd)) mat[,1:2] / mat[,3] } # Set tour projection # Set the tour projection from a GGobi tour. # # If you know the projection you would like to see # in the tour, you can use this function to set it. The # example illustrates setting the projection to show # the first two principle components. # # @arguments GGobiDisplay object running tour # @arguments tour projection # @keyword dynamic #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X \dontrun{ #X pmode(d) <- "2D Tour" #X variables(d) <- list(X=names(mtcars)) #X ggobi_display_get_tour_projection(d) #X pc <- princomp(as.matrix(mtcars))$loadings[,1:2] #X ggobi_display_set_tour_projection(d, pc) #X pc <- princomp(as.matrix(mtcars), cor=T)$loadings #X ggobi_display_set_tour_projection(d, pc)[,1:2] #X } ggobi_display_set_tour_projection <- function(gd, value) { normal <- all(abs(colSums(value^2) - 1) < 1e-3) orthog <- all(abs(crossprod(value, value) - diag(ncol(value))) < 1e-3) if (!normal) stop("Matrix is not normal (column lengths do not equal 1)") if (!orthog) stop("Matrix is not orthogonal") scale <- .GGobiCall("getTourProjection", gd, pmode(gd))[,3] value <- value * scale invisible(.GGobiCall("setTourProjection", gd, pmode(gd), value)) }rggobi/R/plot.r0000644000175100001440000000170212325763563013117 0ustar hornikusers # Set plot range # Set the range of a plot. # # Only applies to scatterplots. # # @keyword internal # @arguments GGobiDisplay object # @arguments plot number # @arguments x range # @arguments y range #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X ggobi_display_set_plot_range(d, x=c(0, 40), y=c(0, 100)) # ggobi_display_set_plot_range <- function (gd, plot=1, x, y) { # x <- rep(x, length=2) # y <- rep(y, length=2) # # .GGobiCall("setPlotRange", as.numeric(x)[1], as.numeric(y)[1], as.numeric(x)[2], as.numeric(y)[2], gd, as.integer(plot)) # invisible() # } # Get plot range # Get plot range as list of X and Y ranges # # @keyword internal # @arguments GGobiDisplay object # @arguments plot number #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X ggobi_display_get_plot_range(d) # ggobi_display_get_plot_range <- function (gd, plot=1) { # range <- .GGobiCall("getPlotRange", gd, as.integer(plot)) # names(range) <- c("x", "y") # range # } rggobi/R/gtk.r0000644000175100001440000000127612325763563012734 0ustar hornikusers# RGtk casting # Cast an object to an RGtk object # # @keyword internal as.RGtkObject <- function(x) { class(x) <- c(class(x), "RGtkObject") x } # Gtk main window # Retrieve RGtk object for main window # # Useful for embedding in other applications or for listening # to their signals via RGtk2. # # @keyword internal ggobi_gtk_main_window <- function(.gobi = ggobi_get()) { .GGobiCall("getMainWindow", .gobi = .gobi) } # Gtk menu bar # Retrieve RGtk object for menu bar # # Useful for embedding in other applications or for listening # to their signals via RGtk2. # # @keyword internal ggobi_gtk_menu_bar <- function(.gobi = ggobi_get()) { .GGobiCall("getMenubar", .gobi = .gobi) } rggobi/R/utils.r0000644000175100001440000000000012325763563013267 0ustar hornikusersrggobi/R/datasets.r0000644000175100001440000001731212326000053013730 0ustar hornikusers# Basic data set manipulation # # Subsetting, dimensions, names etc. # Attempts to mimick R data frames as closely as possible # ============================================================================ # Print GGobiData # Print GGobiData # # By default printing a GGobiData acts like # printing an R data.frame - ie. show all the data # # @arguments GGobi dataset to retrieve # @keyword attribute # @keyword internal print.GGobiData <- function(x, ...) { print(as.data.frame(x), ...) } # GGobiData dimensions # Retrieve the dimension of a GGobiData # # @arguments dataset # @keyword attribute # @keyword internal #X g <- ggobi(mtcars) #X dim(g[1]) dim.GGobiData <- function(x) { .GGobiCall("datasetDim", x) } # GGobiData rows # Retrieve the number of row in a GGobiData # # @arguments dataset # @keyword attribute # @keyword internal nrow.GGobiData <- function(d) dim(d)[2] # GGobiData columns # Retrieve the number of columns in a GGobiData # # @arguments dataset # @keyword attribute # @keyword internal ncol.GGobiData <- function(d) dim(d)[1] # GGobiData column names # Get column names for a GGobiData # # @arguments dataset # @keyword attribute # @keyword internal names.GGobiData <- function(x, ...) { .GGobiCall("getVariableNames", FALSE, x) } # Set column names # Set column names for a GGobiData # # @arguments GGobiData # @arguments new names # @keyword attribute # @keyword internal "names<-.GGobiData" <- function(x, value) { colnames(x) <- value x } # Variable index # Return indices corresponding to variable names # # @arguments GGobiData # @arguments variable names # @returns numeric vector of (0-based) positions # @keyword attribute # @keyword internal variable_index <- function(x, names) { if(length(names) == 0) return(integer(0)) #if(is.integer(names)) return(as.integer(names - 1)) if(is.numeric(names)) return(as.integer(names - 1)) if(is.character(names)) return(as.integer(match(names, names(x)) - 1)) def <- list(X = numeric(0), Y=numeric(0), Z=numeric(0)) if (!is.null(names$X)) def$X <- names$X if (!is.null(names$Y)) def$Y <- names$Y if (!is.null(names$Z)) def$Z <- names$Z lapply(def, function(name) variable_index(x, name)) } # Get row names # Get row names for a GGobiData # # @arguments ggobiDataget # @arguments new names # @keyword attribute # @keyword internal rownames.GGobiData <- function(x) { .GGobiCall("getRowNames", x) } # Set row names # Set row names for a GGobiData # # @arguments GGobiData # @arguments new names # @keyword attribute # @keyword internal #X g <- ggobi(mtcars) #X df <- g[1] #X rownames(df) #X rownames(df) <- tolower(rownames(df)) #X rownames(df) "rownames<-.GGobiData" <- function(x, value) { dims <- dimnames(x) stopifnot(length(x) == length(dims[1])) dims[1] <- value dimnames(x) <- dims x } # Get dimension names # Get row and column names for a GGobiData # # @arguments ggobiDataget # @keyword attribute # @keyword internal dimnames.GGobiData <- function(x) { list(rownames.GGobiData(x), names(x)) } # Set dim names # Set dim names for a GGobiData # # @arguments GGobiData # @arguments new names # @keyword attribute # @keyword internal "dimnames<-.GGobiData" <- function(x, value) { .GGobiCall("setRowNames", as.character(value[[1]]), as.integer(1:length(value[[1]]) - 1), x) .GGobiCall("setVariableNames", as.integer(1:ncol(x) -1 ), as.character(value[[2]]), x) x } # Summarise GGobiData. # Summarise a GGobiData with dimensions, mode and variable names. # # @arguments GGobiData # @arguments ignored # @keyword attribute summary.GGobiData <- function(object, ...) { list(dim = dim(object), mode = mode(object), variables = names(object)) } # Subsettting # Subsetting for ggobi datasets # # This functions allow one to treat a ggobi dataset as if it were a local # data.frame. One can extract and assign elements within the dataset. # # This method works by retrieving the entire dataset into # R, and then subsetting with R. # # @arguments ggobi dataset # @arguments rows # @arguments cols # @arguments drop dimensions? # @value desired subset from data.frame # @alias [[.GGobiData # @alias $.GGobiData # @keyword manip #X g <- ggobi(mtcars) #X x <- g$mtcars #X x[1:5, 1:5] #X x[[1]] #X x$cyl "[.GGobiData" <- function(x, i, j, drop=FALSE) { as.data.frame(x)[i, j, drop=drop] } "$.GGobiData" <- "[[.GGobiData" <- function(x, i) { as.data.frame(x)[[i]] } # Conversion methods # Convert a GGobiData to a regular R data.frame or matrix # # @arguments GGobiData # @keyword manip # @keyword internal # @alias as.matrix.GGobiData "as.data.frame.GGobiData" <- function(x, ...) { gd <- .GGobiCall("getData", x) df <- as.data.frame(gd) rownames(df) <- rownames(x) df } "as.matrix.GGobiData" <- function(x, ...) { as.matrix(as.data.frame(x)) } # Assignments for ggobi datasets # This functions allow one to treat a ggobi dataset as if it were a local data.frame. One can extract and assign elements within the dataset. # # This method works by retrieving the entire dataset into # R, subsetting that copy, and then returning any changes. # # @arguments ggobi dataset # @arguments row indices # @arguments column indices # @arguments new values # @keyword manip # @keyword internal # @alias $<-.GGobiData # @alias [[<-.GGobiData #X g <- ggobi(mtcars) #X x <- g["mtcars"] #X x[1:5, 1:5] #X x[1:5, 1] <- 1:5 #X x[1:5, 1:5] "[<-.GGobiData" <- function(x, i, j, value) { data <- as.data.frame(x) # figure out if any new columns have been added and add them. if (missing(i)) data[,j] <- value else if (missing(j)) data[i,] <- value else data[i, j] <- value for(var in unique(j)) { x[[var]] <- data[[var]] } x } "$<-.GGobiData" <- "[[<-.GGobiData" <- function(x, i, value) { df <- as.data.frame(x) if (is.null(value)) { ggobi_data_remove_variable(x, i) } else if (is.null(df[[i]])) { ggobi_data_add_variable(x, value, i) } else { ggobi_data_set_variable(x, value, i) } x } # Set variable values # Set the variable values for a column in a GGobiData # # @arguments GGobiData # @arguments values of new variable # @arguments variable name # @arguments update? # @keyword internal ggobi_data_set_variable <- function(x, vals, var, update = TRUE) { varId <- variable_index(x, var) if(any(is.na(varId))) stop("Invalid variable") .GGobiCall("setVariableValues", as.numeric(vals), as.integer(1:length(vals) - 1), varId, as.logical(update), x) x } # Add variable # Add variable to a GGobiData # # @alias addVariable # @arguments GGobiData # @arguments values to add # @arguments name of column to add # @keyword internal ggobi_data_add_variable <- function(x, vals, name, ...) { if (!(is.factor(vals) || is.numeric(vals))) stop("Variable must be a factor or numeric") if (length(vals) != nrow(x)) stop("Variable must be same length as existing data set") levels <- NULL values <- NULL if(is.factor(vals)) { levels <- table(vals) values <- sort(unique(as.integer(vals))) } .GGobiCall("addVariable", as.numeric(vals), as.character(name), levels, values, x) } # Remove variable # Remove variables from a GGobiData object # # @keyword internal ggobi_data_remove_variable <- function(x, var) { varId <- variable_index(x, var) if(any(is.na(varId))) stop("Invalid variable") .GGobiC("removeVariables", varId, x)[[1]] } ids <- function(x) UseMethod("ids", x) "ids<-" <- function(x, value) UseMethod("ids<-", x) # Row ids # Retrive row ids from a GGobiData # # @alias ids # @arguments GGobiData # @keyword manip # @seealso \code{\link{ids<-}} ids.GGobiData <- function(x) { .GGobiCall("getCaseIds", x) } # Set row ids # Set row ids from a GGobiData # # @alias ids<- # @arguments GGobiData # @arguments new values # @keyword manip # @seealso \code{\link{ids}} "ids<-.GGobiData" <- function(x, value) { .GGobiCall("setIDs", as.character(value), .data=x) x } ## for S4 integration # setOldClass("GGobiData") rggobi/R/glyphs.r0000644000175100001440000001371312325763563013454 0ustar hornikusers# "Manual" brushing # Set colours and glyphs # ============================================================================ # Map glyph type. # Map glyph character code to number # # @arguments vector of glyph character codes # @keyword dynamic # @keyword internal mapGlyphType <- function(types) { if (!is.character(types)) return(as.integer(types)) stop("Character glyph types not yet supported") #sys.types <- getGlyphTypes.ggobi() #ids <- match(types, names(sys.types)) #if (any(is.na(ids))) { # stop(paste("Invalid glyph name(s):",paste(types[is.na(ids)], collapse=", "))) #} #ids } glyph_type <- function(x) UseMethod("glyph_type", x) "glyph_type<-" <- function(x, value) UseMethod("glyph_type<-", x) glyph_size <- function(x) UseMethod("glyph_size", x) "glyph_size<-" <- function(x, value) UseMethod("glyph_size<-", x) glyph_color <- glyph_colour <- function(x) UseMethod("glyph_colour", x) "glyph_color<-" <- "glyph_colour<-" <- function(x, value) UseMethod("glyph_colour<-", x) # Get glyph type. # Get glyph type. # # Glyph type refers to the shape of the glyph, one of: # # \itemize{ # \item a filled circle # \item an empty circle # \item a filled square # \item an empty square # \item a single pixel # \item a plus sign # \item a cross # } # # @alias glyph_type # @arguments GGobiData # @keyword dynamic # @seealso \code{\link{glyph_type<-}} glyph_type.GGobiData <- function(x) { which <- 1:nrow(x) .GGobiCall("getCaseGlyphs", as.integer(which - 1), x, .gobi = attr(x, "ggobi"))$type + 1 } # Set glyph type # Set glyph type # # @alias glyph_type<- # @arguments GGobiData # @arguments vector of new types # @keyword dynamic # @seealso \code{\link{glyph_type}} "glyph_type<-.GGobiData" <- function(x, value) { which <- 1:nrow(x) types <- mapGlyphType(value) types <- rep(types - 1, length=length(which)) sizes <- rep(as.integer(-1), length(which)) .GGobiCall("setCaseGlyphs", as.integer(types), as.integer(sizes), as.integer(which - 1), x, .gobi = attr(x, "ggobi")) x } # Get glyph size # Get glyph size # # Glyph size is an integer between 1 and 6. # # @alias glyph_size # @arguments GGobiData # @keyword dynamic # @seealso \code{\link{glyph_size<-}} glyph_size.GGobiData <- function(x) { which <- 1:nrow(x) .GGobiCall("getCaseGlyphs", as.integer(which - 1), x, .gobi = attr(x, "ggobi"))$size + 1 } # Set glyph size # Set glyph size # # Glyph size is an integer between 1 and 6. # # @alias glyph_size<- # @arguments GGobiData # @arguments vector of new sizes # @keyword dynamic # @seealso \code{\link{glyph_size}} "glyph_size<-.GGobiData" <- function(x, value) { which <- 1:nrow(x) sizes <- rep(value - 1, length=length(which)) types <- rep(as.integer(-1), length(which)) .GGobiCall("setCaseGlyphs", as.integer(types), as.integer(sizes), as.integer(which - 1), x, .gobi = attr(x, "ggobi")) x } # Get glyph colour # Get glyph colour # # @alias glyph_colour # @arguments GGobiData # @alias glyph_color # @keyword dynamic # @seealso \code{\link{glyph_colour<-}} glyph_colour.GGobiData <- function(x) { which <- 1:nrow(x) .GGobiCall("getCaseColors", as.integer(which - 1), x, .gobi = attr(x, "ggobi")) + 1 } # Set glyph colour # Set glyph colour # # @alias glyph_colour<- # @alias glyph_color<- # @arguments GGobiData # @arguments vector of new colours # @seealso \code{\link{glyph_colour}} # @keyword dynamic "glyph_colour<-.GGobiData" <- function(x, value) { #colors <- resolveColors.ggobi(value) colors <- rep(as.integer(value), length=nrow(x)) ind <- 0:(length(colors)-1) if(any(colors < 1) || any(colors > 65535) || is.na(colors)) stop("All color indices must be positive and less than 65536.") .GGobiCall("setCaseColors", colors, as.integer(ind), x) x } # Sampling, selection, hiding, exclusion # ============================================================================ # Get and set exclusion # Get and set the exclusion status of points # # @keyword internal # @alias excluded<- excluded <- function(x) UseMethod("excluded", x) "excluded<-" <- function(x, value) UseMethod("excluded<-", x) # Get excluded status # Get the exclusion status of points. # # If a point is excluded it is not drawn. # # @arguments ggobiDataget # @keyword dynamic # @seealso \code{\link{excluded<-}} excluded.GGobiData <- function(x) { .GGobiCall("getExcludedIndices", .data = x) } # Set excluded status # Set the exclusion status of points. # # If a point is excluded it is not drawn. # # @arguments GGobiData # @arguments logical vector # @keyword dynamic # @seealso \code{\link{excluded}} "excluded<-.GGobiData" <- function(x, value) { .GGobiCall("setExcludedIndices", rep(as.logical(value), length=nrow(x)), .data = x) x } # Get selection status # Returns logical vector indicating if each point is under the brush # # @alias selected # @arguments GGobiData # @arguments logical vector # @keyword dynamic selected.GGobiData <- function(x) { sel <- .GGobiCall("getSelectedIndices", .data=x) if(is.null(sel)) logical(nrow(x)) else { !is.na(match(seq(1, length = nrow(x)), sel)) } } selected <- function(x) UseMethod("selected", x) # Get shadowed status # Get the exclusion status of points. # # If a point is shadowed it is drawn in a dark gray colour, # behind all non-shadowed points. It cannot be selected. # # @alias shadowed # @arguments ggobiDataget # @keyword dynamic # @seealso \code{\link{shadowed<-}} shadowed.GGobiData <- function(x) { .GGobiCall("getCasesHidden", .data=x) } shadowed <- function(x) UseMethod("shadowed", x) # Set shadowed status # Set the exclusion status of points. # # If a point is shadowed it is drawn in a dark gray colour, # behind all non-shadowed points. It cannot be selected. # # @alias shadowed<- # @arguments GGobiData # @arguments logical vector # @keyword dynamic # @seealso \code{\link{shadowed}} "shadowed<-.GGobiData" <- function(x, value) { .GGobiCall("setCasesHidden", rep(as.logical(value), length=nrow(x)), as.integer((1:nrow(x))-1), .data = x) x } "shadowed<-" <- function(x, value) UseMethod("shadowed<-", x) rggobi/R/call.r0000644000175100001440000000622712761400711013046 0ustar hornikusers # GGobi symbol creation # Maps the given name to the name of the corresponding C routine # # A simple way of generating the prefix for a symbol # used in this package/library so that we can hide # it from other packages and avoid conflicts. # # @keyword dynamic # @keyword internal # @value the name of the C routine corresponding to its argument .ggobi.symbol <- function(name) paste("RS_GGOBI", name, sep="_") # Calling native routines # Wrappers for calling C routines in the R-ggobi library. # # \code{.GGobiC} and \code{.GGobiCall} convert the name and then call # their C invocation counterparts. # # These functions map the simple name of a C routine into the # package-specific version of that name. These allow use to hide the # use a name \emph{mangling} scheme of our choosing for the C level # routines in the shared library/DLL that provides the glue between R # and ggobi. This is useful for avoiding name conflicts with other C # code in R or other packages. These are only of relevance to the # developers of this package and those working with its C code. # # The mapping of the name to its corresponding C routine name # is done in conjunction with the pre-processor macro # \code{RS_GGOBI}. These must be synchronized. # # @alias .GGobiC # @arguments the simple name of the C routine to be resolved # @arguments the arguments that to be passed to the \code{\link{.C}} or \code{\link{.Call}} # @arguments the ggobi instance identifier that is to be passed to the C routine as its last argument # @value the same result as the corresponding \code{.C} and \code{.Call} # @references \url{http://www.ggobi.org/} # @seealso \code{\link{.C}}, \code{\link{.Call}} # @keyword dynamic # @keyword internal .GGobiCall <- function(.name, ..., .gobi = ggobi_get(), .test=TRUE) { if (.test && !is.null(.gobi) && !valid_ggobi(.gobi)) stop("Invalid ggobi reference", call.=FALSE) .Call(.ggobi.symbol(.name), ..., .gobi, PACKAGE = "rggobi") } .GGobiC <- function(.name, ..., .gobi = ggobi_get(), .test=TRUE) { if (.test && !is.null(.gobi) && !valid_ggobi(.gobi)) stop("Invalid ggobi reference", call.=FALSE) sym <- .ggobi.symbol(.name) if (!is.null(.gobi)) .C(sym, ..., .gobi, PACKAGE = "rggobi") else .C(sym, ..., PACKAGE = "rggobi") } # Validity checking # Determines whether a reference to an internal ggobi object is valid # # One can create multiple, independent ggobi instances within a single # R session and one can also remove them either programmatically or # via the GUI. To be able to refer to these objects which are # actually C-level internal objects, one has a reference or handle # from an S object. Since the C level object can be destroyed while the S # object still refers to them, this function allows one to check whether the # internal object to which R refers is still in existence. # # @arguments an object of class \code{ggobi} which refers to an internal ggobi instance. # @value \code{TRUE} if real object still exist, \code{FALSE} otherwise # @keyword dynamic #X g <- ggobi(mtcars) #X valid_ggobi(g) #X close(g) #X valid_ggobi(g) # @keyword internal valid_ggobi <- function(.gobi) { .GGobiCall("isValid", .gobi=.gobi, .test=FALSE) } rggobi/R/next-version/0000755000175100001440000000000012325763563014417 5ustar hornikusersrggobi/R/next-version/brush.r0000644000175100001440000000427512325763563015735 0ustar hornikusers# GGobi brushing (size, location, glyph, etc) brushSize <- function(x, ...) UseMethod("brushSize") brushSize.GGobi <- function(.data = 1, .gobi = ggobi_get(), units=0) { ## Passing negative dimensions means that we just get the current value back .GGobiCall("setBrushSize", as.integer(c(-1,-1)), .gobi = x) } brushLocation <- function(x, ...) UseMethod("brushLocation") brushLocation.GGobi <- function(.data=1, .gobi = ggobi_get(), units=0) { setBrushLocation.ggobi(as.integer(-1), as.integer(-1), .data, .gobi=.gobi) } "brushLocation<-" <- function(x, value) { x <- value[1] y <- value[2] tmp <- .GGobiCall("setBrushLocation", as.integer(value), .gobi = x) if(!is.null(tmp)) names(tmp) <- c("x", "y") return(tmp) } setBrushLocation.ggobi <- function(x, y, .data = 1, .gobi = ggobi_get(), update = TRUE, units = 0) { } "brushSize<-" <- function(x, value) UseMethod("brushSize") "brushSize<-.GGobi" <- function(x, value) { w <- as.integer(value[1]) h <- as.integer(value[2]) tmp <- .GGobiCall("setBrushSize", as.integer(c(w,h)), .gobi = x) if(!is.null(tmp)) names(tmp) <- c("width", "height") return(tmp) } "brushColor<-" <- function(x, value) UseMethod("brushColor") "brushColor<-.GGobi" <- function(x, value) { if(value < 1 || value > 65535 || is.na(value)) stop("Color index must be positive and less than 65536.") .GGobiCall("setBrushColor", as.integer(id-1), .gobi=x) } brushColor <- function(x, ...) UseMethod("brushColor") brushColor.GGobi <- function(x) { .GGobiCall("getBrushColor", .gobi=x) } setBrushGlyph.ggobi <- function(type = -1, size = -1, .gobi = ggobi_get()) { if(missing(type) & missing(size)) stop("Must specify a glyph size or type") if(is.character(type)) { type <- mapGlyphType(type) } .GGobiCall("setBrushGlyph", as.integer(c(type, size)), .gobi=.gobi) return(TRUE) } brushGlyph <- function(x, ...) UseMethod("brushGlyph") brushGlyph.GGobi <- function(x) { x <- .GGobiCall("getBrushGlyph", .gobi = x) if(is.null(x)) return(x) n <- getGlyphTypes.ggobi() names(x) <- c( names(n)[x[1] == n], "size") x } glyphTypes <- function() .GGobiCall("getGlyphTypes") glyphSizes <- function() .GGobiCall("getGlyphSizes") rggobi/R/next-version/plotLayout.S0000644000175100001440000000227212325763563016722 0ustar hornikusers# # # # plotLayout <- function(..., mfrow = NULL, cells = NULL, .data = 1, .gobi=ggobi_get(), display = -1) { if(mode(display) == "numeric") { display <- as.integer(display) } else if(inherits(display, "ggobiDisplay")) display <- display[["ref"]] plots <- list(...) n <- length(plots) if(n == 0) plots <- NULL else { plots <- lapply(plots, resolvePlotDescription, .data = .data, .gobi = .gobi) } # We can compute this if it is missing and cells is not. if(length(mfrow) == 0) { nrows <- n # ceiling(sqrt(n)) ncols <- 1 # sqrt(n) mfrow <- c(nrows, ncols) } if(missing(cells)) cells <- t(gtkCells(mfrow[1], mfrow[2])) else { # We'll transpose gtkCells for you. if(ncol(cells) == 4) cells <- t(cells) } if(mode(.data) == "numeric") { .data <- as.integer(.data -1) } if(mode(.gobi) == "numeric") { .gobi <- as.integer(.gobi -1) } val <- .Call(.ggobi.symbol("createPlots"), plots, as.integer(mfrow), as.integer(cells-1), .gobi, display, .data, PACKAGE = "rggobi") gdk.flush() val } gtkCells <- function(r, c) { x <- rep(1:c, r) y <- rep(1:r, rep(c, r)) l <- cbind(left = x, right = x+1, top = y, bottom = y+1) l } rggobi/R/next-version/colour-schemes.r0000644000175100001440000000772212325763563017542 0ustar hornikuserssetClass("Color", representation()) setClass("RGBColor", representation("Color", "numeric"), prototype = c(red=0,green=0,blue=0)) setClass("ColorScheme", representation( colors="list", background="Color", annotations="Color", criticalvalue = "integer", description = "character", type = "integer", system = "integer", name="character" ) ) # Retrieve R descriptions of GGobi color schemes # Retrieve R descriptions of GGobi color schemes # # This retrieves R objects representing a collection of GGobi color schemes # directly from GGobi itself. It can access either a particular GGobi # instance's color scheme list or the session-wide schemes. Color schemes # can also be read from their XML representation, but this allows one to query # the actual ones that are available to a GGobi session or instance. # # @arguments the GGobi instance from which to query the color schemes, defaults to active # @value A list of the color schemes in the GGobi list. Each element is of class \code{ColorScheme}. # @ref \references{\url{http://www.ggobi.org}} # @seealso \link{addColorScheme}, \link{setActiveColorScheme} # @keyword color getColorSchemes <- function(.gobi = NULL) { .GGobiCall("getColorSchemes", .gobi = .gobi) } # Adds a color scheme to a GGobi instance or the global color scheme list. # Adds a color scheme to a GGobi instance or the global color scheme list. # # This takes an R color scheme description and adds an equivalent representation # to either the color schemes available to a particular GGobi instance or to the global # list of color schemes within a GGobi session. # # @arguments the \code{ColorScheme object. } # @arguments the name to identify/describe the scheme. # @arguments a logical value indicating whether we should replace any existing entry with this name with the new scheme (\code{TRUE}), or simply append the new scheme to the end of the list. #@arguments a logical value that indicates whether to also make this the active color scheme. See \code{setActiveColorScheme} # @arguments the GGobi instance to which to append the new color scheme, or if \code{NULL}, the color scheme is added to the session options and will be available to new GGobi instances created after this. # @value The index/position in the appropriate list of color schemes to which the new scheme was added. # @keyword color addColorScheme <- function(scheme, name = scheme@name, overwrite = FALSE, set = FALSE, .gobi = NULL) { ans <- .GGobiCall("addColorScheme", scheme, as.character(name), as.logical(overwrite), .gobi = .gobi) if (set) setActiveColorScheme(name, .gobi = .gobi) ans } # Map names to color values in a ggobi instance. # Map names to color values in a ggobi instance. # # This currently does not work but will when color schemes are enabled in GGobi. # # Colors in ggobi are represented by entries in a color table or matrix as # Red, Green and Blue values. To set a color, one can identify the entry in that # table either by number/index or by name. This function maps color names to the # corresponding index so that these values can be passed to the low-level C routines. # This function is typically called internally. # # @arguments names of colors to be resolved in the specified color scheme of the ggobi instance. # @arguments the name of color scheme of interest in which to resolve the color names. # @arguments the ggobi instance whose color schemes are to be used to resolve the \code{scheme}, if \code{NULL}, the color schemes from the GGobi session options are used. # @value An integer vector specifying the indices of the entries in the color scheme corresponding to the specified names. # @keyword color resolveColors.ggobi <- function(colNames, scheme) { if (is.numeric(colNames)) return(as.integer(colNames)) if(missing(scheme) || as.character(scheme) == "") { scheme = getActiveColorScheme() } else { scheme = getColorSchemes()[[as.character(scheme)]] } match(as.character(colNames), names(scheme@colors)) } rggobi/R/next-version/PlotDescriptions.S0000644000175100001440000000435212325763563020054 0ustar hornikusers# # These functions create a ``virtual'' description # of a ggobi plot without actually creating the plot. # They act as templates allowing the user to create # descriptions that can be resolved or instantiated # into real ggobi plots. # # See plotLayout() which takes a collection of these # plot descriptions and a layout specification and # creates a new display with the instantiated plots. parallelCoordDescription <- function(..., .data = -1, .gobi=NULL) { pl <- list(vars = c(...), ggobi=.gobi, .data=.data) class(pl) <- ifelse(length(pl$vars) > 1, "MultipleParallelCoordinates", "ParallelCoordinates") pl } ashDescription <- function(x, .data = -1, .gobi=NULL) { pl <- list(vars = x, ggobi=.gobi, .data=.data) class(pl) <- "GGobiAsh" pl } scatterplotDescription <- function(x, y, .data = -1, .gobi=NULL) { pl <- list(vars = c(x, y), ggobi=.gobi, .data=.data) class(pl) <- "ScatterPlot" pl } scatmatrixDescription <- function(..., .data = -1, .gobi=NULL) { pl <- list(vars = c(...), ggobi=.gobi, .data = .data) class(pl) <- "ScatmatrixPlot" pl } timeseriesDescription <- function(..., .data = -1, .gobi = NULL) { pl <- list(vars=c(...), ggobi=.gobi, .data = .data) class(pl) <- "TimeSeriesPlot" pl } plotList <- function(..., mfrow = NULL, cells = NULL) { plots <- list(plots = list(...), mfrow = mfrow, cells = cells) class(plots) <- "ggobiPlotList" return(plots) } resolvePlotDescription <- # # Transforms variable names into indices # by resolving them relative to the specified # dataset within the given ggobi instance # function(desc, .data = 1, .gobi = ggobi_get(), isError = TRUE) { if(is.null(desc)) return(NULL) if(is.character(desc$vars)) { if(!is.null(desc$ggobi)) { .gobi <- desc$ggobi } else desc$ggobi <- .gobi if(desc$.data > -1) { .data <- desc$.data } else desc$.data <- .data nms <- getVariableNames.ggobi(.data = .data, .gobi= .gobi) idx <- match(desc$vars, nms) if(any(is.na(idx)) && isError) stop(paste("Cannot resolve variable name", desc$vars[is.na(idx)],"in ggobi")) desc$vars <- idx } else { desc$vars <- as.integer(desc$vars) if(desc$.data < 0) desc$.data <- .data if(is.null(desc$ggobi)) desc$ggobi <- .gobi } desc } rggobi/R/next-version/brush.S0000644000175100001440000000437312325763563015675 0ustar hornikusers# GGobi brushing (size, location, glyph, etc) getBrushSize.ggobi <- function(.data = 1, .gobi = ggobi_get(), units=0) { # Passing negative dimensions means that we just get the current value back setBrushSize.ggobi(as.integer(-1), as.integer(-1), .gobi=.gobi) } brush_location.ggobi <- function(.data=1, .gobi = ggobi_get(), units=0) { setBrushLocation.ggobi(as.integer(-1), as.integer(-1), .data, .gobi=.gobi) } setBrushLocation.ggobi <- function(x, y, .data = 1, .gobi = ggobi_get(), update = TRUE, units = 0) { if(length(x) > 1 && missing(y)) { x <- as.integer(x) y <- as.integer(x[2]) } if(mode(.data) == "numeric") .data <- as.integer(.data - 1) tmp <- .GGobiCall("setBrushLocation", as.integer(c(x[1],y[1])), .data, .gobi = .gobi) if(!is.null(tmp)) names(tmp) <- c("x", "y") return(tmp) } setBrushSize.ggobi <- function(w, h, .data = 1, .gobi = ggobi_get(), update = TRUE, units = 0) { if(length(w) > 1 && missing(h)) { w <- as.integer(w) h <- as.integer(w[2]) } if(mode(.data) == "numeric") .data <- as.integer(.data - 1) tmp <- .GGobiCall("setBrushSize", as.integer(c(w[1],h[1])), .data, .gobi = .gobi) if(!is.null(tmp)) names(tmp) <- c("width", "height") return(tmp) } setBrushColor.ggobi <- function(id, .gobi = ggobi_get()) { if(is.character(id)) { which <- match(id, rownames(getColorMap.ggobi(.gobi))) if(any(is.na(which))) { stop(paste("Unrecognized color(s)", id[is.na(which)])) } id <- which } .GGobiCall("setBrushColor", as.integer(id-1), .gobi=.gobi) } getBrushColor.ggobi <- function(.gobi = ggobi_get()) { .GGobiCall("getBrushColor", .gobi=.gobi) } setBrushGlyph.ggobi <- function(type = -1, size = -1, .gobi = ggobi_get()) { if(missing(type) & missing(size)) stop("Must specify a glyph size or type") if(is.character(type)) { type <- mapGlyphType(type) } .GGobiCall("setBrushGlyph", as.integer(c(type, size)), .gobi=.gobi) return(TRUE) } getBrushGlyph.ggobi <- function(.gobi = ggobi_get()) { x <- .GGobiCall("getBrushGlyph", .gobi = .gobi) if(is.null(x)) return(x) n <- getGlyphTypes.ggobi() names(x) <- c( names(n)[x[1] == n], "size") x } getGlyphTypes.ggobi <- function() .GGobiCall("getGlyphTypes") getGlyphSizes.ggobi <- function() .GGobiCall("getGlyphSizes") rggobi/R/next-version/options.r0000644000175100001440000000203312325763563016273 0ustar hornikusers # Get ggobi options # @keyword internal goptions <- function(x) UseMethod("goptions", x) # Get ggobi options # @keyword internal goptions.GGobiDisplay <- function(x) { .GGobiCall("getDisplayOptions", x) } goptions.GGobi <- function(x) { goptions.GGobiDisplay(NULL) } # @keyword internal "goptions<-" <- function(x, value) UseMethod("goptions<-", x) # Set defaults for display options # "goptions<-.GGobi" <- function(x, value) { goptions.GGobiDisplay(NULL) <- value } # Changes the settings of the display options for a display. # These options correspond to options available in the display menus in GGobi. # # Possible options: # # * "Show Points" # * "Show axes" # * "Show tour axes" # * "Show axes labels" # * "Directed edges" # * "Undirected edges" # * "Arrowheads" # * "Show whiskers" # # @arguments GGobiDisplay to modify # @arguments list of new settings # @keyword manip "goptions<-.GGobiDisplay" <- function(x, value) { old <- goptions(x) cur <- update(old, value) .GGobiCall("setDisplayOptions", cur, x) x } rggobi/R/zzz.r0000644000175100001440000000516412326000511012756 0ustar hornikusers# Check structs # Validates GGobi and Rggobi views of internal data structures # # This function is called when the Rggobi library is loaded and it verifies # that the sizes of the different internal data structures for GGobi are the # same for both the GGobi shared library/DLL and the Rggobi package. This is # important as the two shared libraries are compiled separately and may have # different compilation flags, etc. that make them incompatible. This # function simply compares the sizes of the two views of the structures and # raises a warning if they do not agree. # # Essentially, you should never notice this function. A warning implies that # you need to re-install Rggobi against the version of GGobi you are using. # # @value TRUE if the sizes in the two libraries are the same, otherwise a named logical vector indicating which structures are different # # @keyword programming # @keyword internal ggobi_check_structs <- function() { ours <- .Call(.ggobi.symbol("getStructSizes"), TRUE, PACKAGE = "rggobi") theirs <- .Call(.ggobi.symbol("getStructSizes"), FALSE, PACKAGE = "rggobi") which <- match(names(ours), names(theirs)) if(any(is.na(which))) stop(paste("No information about some struct(s):", paste("`", names(ours)[is.na(which)],"'", collapse=", ", sep=""))) ok <- ours == theirs[which] if(!all(ok)) { warning("Some structs have different size: ", paste(paste(names(ours)[!ok], "(", ours[!ok], "!=", theirs[which][!ok], ")"), collapse=", "), ". You may have an incompatible version of GGobi installed.", call.=FALSE) return(ok) } TRUE } # check that rggobi and GGobi by major.minor versions are the same # to ensure binary compatibility # also make sure GGobi is later than 2.1.6, since that is where # we started the above version policy .check_versions <- function() { versions <- c( rggobi = packageDescription("rggobi", fields = c("Version")), ggobi = ggobi_version()$"version string" ) if (compareVersion(versions["ggobi"], "2.1.6") < 0) warning("Your GGobi is too old - please update to the latest version") # strip micro version and rev versions <- sub("\\.[^.]*$", "", sub("-.*", "", versions)) ver_comp <- compareVersion(versions["rggobi"], versions["ggobi"]) if (ver_comp != 0) { if (ver_comp < 0) versions <- rev(versions) warning("Your ", names(versions)[1], " version (", versions[1], ") is later than your ", names(versions)[2], " version (", versions[2], "). Please try to update your ", names(versions)[2], ".") } ver_comp == 0 } .onLoad <- function(libname, pkgname) { ggobi_check_structs() .check_versions() TRUE } rggobi/R/display-variables.r0000644000175100001440000001072212325763563015556 0ustar hornikusers# Display construction # Create a new display # # @keyword internal display <- function(x, ...) UseMethod("display", x) # Create a new display # Create a new display for the GGobiData object. # # This function allows you to create a new display from # a GGobiData object. You will need to specify the type of display you # want ("Scatterplot Display", "Scatterplot Matrix" and "Parallel Coordinates # Display" are the most common), and which variables the plot # should be intialised with. Specifying more than two variables only makes # sense for scatterplot matrices and pcps. # # Many of the plots used in GGobi (eg. the tours and densities plots) are # special modes of the scatterplot display. You will need to create a # new scatterplot display, change the projection mode to what you want, # and then set the variables. Hopefully this will be improved in a future # version of rggobi. # # @arguments GGobiData object # @arguments projection mode to use # @arguments variables to display, see \code{\link{variables.GGobiDisplay}} for details # @arguments If TRUE, returns widget for use with RGtk2 # @arguments ignored # @seealso \code{\link{ggobi_display_types}} for a list of display types # @keyword dynamic #X g <- ggobi(mtcars) #X display(g[1]) #X display(g[1], vars=list(X=4, Y=5)) #X display(g[1], vars=list(X="drat", Y="hp")) #X display(g[1], "Parallel Coordinates Display") #X \dontrun{ #X display(g[1], "2D Tour") #X display(g[1], "2x1D Tour", list(X=c(1,2,3), Y=c(4,5,6))) #X } #X display(g[1], "Scatterplot Matrix") display.GGobiData <- function(x, pmode="Scatterplot Display", vars=list(X=names(x)), embed=FALSE, ...) { type <- pmodes()[pmode] ivars <- variable_index(x, vars) embed <- as.logical(embed) d <- .GGobiCall("createDisplay", ggobi_display_make_type(type), ivars$X, x, !embed) if (type != pmode) { pmode(d) <- pmode } variables(d) <- vars d } # Get variables # Get variable names from a container # # @keyword internal variables <- function(x) UseMethod("variables", x) # Set variables # Set variable names in a container # # @keyword internal "variables<-" <- function(x, value) UseMethod("variables<-", x) # Get display variables # List the variables used in a given display # # There are three types of variables in GGobi displays: # X, Y, Z, which correspond to the labels on the toggle buttons # in GGobi. Most plots have a constrained set of possible options. # For example, in tours you can only set X variables, and you must # have at least three. Or in the rotation plot, you need exactly # one X, Y, and Z variable. You can figure out what these # conditions are by using the toggle buttons in GGobi. # # @arguments GGobiDisplay object # @keyword dynamic # @seealso \code{\link{variables<-.GGobiDisplay}} for examples variables.GGobiDisplay <- function(x) { vars <- .GGobiCall("getDisplayVariables", x, .gobi=ggobi(x)) names(vars[[1]]) <- colnames(dataset(x))[vars[[1]] + 1] split(vars[[1]] + 1, factor(vars[[2]], levels = c("X", "Y", "Z"))) } # Set display variables # Set display variables with a list of x, y, and z component variable indices. # # There are three types of variables in GGobi displays: # x, y, z, which correspond to the labels on the toggle buttons # in GGobi. Most plots have a constrained set of possible options. # For example, in tours you can only set x variables, and you must # have at least three. Or in the rotation plot, you need exactly # one x, y, and z variable. # # Currently, there is no checking done to ensure that you are # sending a sensible set of variables for the given display type. # Generally, any invalid choices will be silently ignored. # # @arguments GGobiDisplay object # @arguments list with X, Y and Z components listing the variable indices to display, either as numeric position or character variable name # @keyword dynamic #X g <- ggobi(mtcars) #X d <- display(g[1], "Parallel Coordinates Display") #X variables(d) #X variables(d) <- list(X=1:8) #X variables(d) <- list(X=c("mpg", "cyl")) #X variables(d) "variables<-.GGobiDisplay" <- function(x, value) { stopifnot(is.list(value)) names(value) <- toupper(names(value)) d <- dataset(x) prev_vars <- variable_index(d, variables(x)) new_vars <- variable_index(d, value) if (any(is.na(new_vars))) stop("Variable(s) ", paste(value[is.na(new_vars)], collapse=", "), " not in dataset") prev_vars <- mapply(setdiff, prev_vars, new_vars, SIMPLIFY=FALSE) .GGobiCall("setDisplayVariables", new_vars, prev_vars, x, .gobi=ggobi(x)) x } rggobi/R/longitudinal.r0000644000175100001440000000443112761400130014612 0ustar hornikusers # Create longitudinal dataset. # Instantiate new ggobi with a longitudinal data set. # # This function allows you to load longitudinal data in # to GGobi and display it as a line plot. This is achieved # by creating edges between adjacent time points, for a given # id variable. # # For best viewing, we recommend that you turn the show points off # in the options menu. When brushing, you may also want to use # categorical brushing on the id variable, so that the entire # series is selected for an observation. # # @arguments data frame # @arguments time variable # @arguments id variable # @arguments ggobi instance, if you don't want to create a new one # @keyword dynamic #X data(Oxboys, package="nlme") #X ggobi_longitudinal(Oxboys, Occasion, Subject) #X ggobi_longitudinal(stormtracks, seasday, id) #X ggobi_longitudinal(data.frame(x=1:100, y=sin(1:100))) ggobi_longitudinal <- function(data, time=1:rows, id=rep(1, rows), g = NULL) { name <- deparse(substitute(data)) rows <- nrow(data) time <- eval(substitute(time), data) obsUnit <- eval(substitute(id), data) or <- order(obsUnit, time) tmp <- data[or, ] if (is.null(g)) { g <- ggobi(tmp, name=name) } else { g[name] <- tmp } edges <- cbind(rownames(tmp[-nrow(tmp), ]), rownames(tmp[-1, ])) matching <- obsUnit[or][-1] == obsUnit[or][-nrow(tmp)] edges[!matching, ] <- NA edges <- edges[stats::complete.cases(edges),] d <- data.frame(tmp[edges[,1], sapply(tmp, is.factor), drop=FALSE]) rownames(d) <- paste(name, 1:nrow(d), sep="") g[paste(name, "edges", sep="-")] <- d edges(g[paste(name, "edges", sep="-")]) <- edges if (!is.null(ggobi)) { d <- displays(g)[[1]] edges(d) <- g[2] } invisible(g) } # Create parallel coordinates plot. # Mock up a pcp plot using points and edges. # # Experimental and may suggest ways to reduce PCP code in GGobi # # @keyword internal ggobi_pcp <- function(data, type="range") { if (!requireNamespace("reshape", quietly = TRUE)) stop("Must have reshape package installed") data$CASEID <- factor(1:nrow(data)) datam <- reshape::melt(reshape::rescaler(data, type=type), id = "CASEID") g <- ggobi_longitudinal(datam, id=CASEID) g$raw <- data d <- displays(g)[[1]] edges(d) <- g[1] variables(d) <- list(X="variable", Y="value") invisible(g) } globalVariables("CASEID") rggobi/R/data.r0000644000175100001440000001135212325763563013054 0ustar hornikusers# Set data # =================================================================== # [<-.GGobi # Add data to ggobi instance. # # This function allows you to add (and eventually) replace # GGobiData objects in a GGobi instance. # # @arguments ggobi instance # @arguments name of data frame # @arguments data.frame, or string to path of file to load # @alias $<-.GGobi # @alias [[<-.GGobi # @keyword manip #X g <- ggobi() #X g["a"] <- mtcars #X g$b <- mtcars "[<-.GGobi" <- function(x, i, value) { if (inherits(value, "GGobiData")) return(x) if (length(i) != 1) stop("You may only add or replace one dataset at a time") replace <- (i %in% names(x)) if (replace) { warning("Replacement does not work") return(x) } if(is.character(value)) { ggobi_set_data_file(value, .gobi = x) } else { ggobi_set_data_frame(as.data.frame(value), name = clean.ggobi(i), .gobi = x) } x } "[[<-.GGobi" <- "$<-.GGobi" <- function(x, i, value) { x[i] <- value x } # Set data file. # Open data file and add to ggobi datasets. # # @arguments path to file # @arguments mode of file # @arguments add? # @arguments ggobi instance # @returns GGobiData # @keyword manip # @keyword internal ggobi_set_data_file <- function(file, mode = "unknown", add = TRUE, .gobi = ggobi_get()) { num <- .GGobiCall("setFile", as.character(file), as.character(mode), as.logical(add), .gobi = .gobi) if(num > -1) { dataset(num, .gobi) } else { warning(paste("Failed to open", file)) } } # Set data frame. # Add data.frame to ggobi instance. # # @arguments data frame to add # @arguments data set name (appears on tabs in ggobi) # @arguments description of data frame # @arguments rownames # @arguments ggobi instance # @returns GGobiData # @keyword manip # @keyword internal ggobi_set_data_frame <- function(data, name = deparse(sys.call()[[2]]), description = paste("R data frame", name), id = NULL, .gobi = ggobi_get()) { n <- dimnames(data) if (is.null(id)) { if (.row_names_info(data) < 0) { id <- paste(name, seq(1, nrow(data)), sep="") } else { id <- rownames(data) } } else { if (length(id) != nrow(data)) stop("Length of id does not match rows of data") } # Convert character columns to factors char <- unlist(lapply(data, is.character)) data[char] <- lapply(data[char], factor) .data <- .GGobiCall("addData", data, n[[1]], n[[2]], dim(data), as.character(description), as.character(name), as.character(id), .gobi = .gobi) .data } # Get data # =================================================================== # Get ggobi data. # Conveniently retrieve ggobi dataset. # # It is convenient to be able to refer to and operate on a ggobi # dataset as if it were a regular R dataset. This function allows one to # get an \code{GGobiData} object that represents a particular # dataset. # # @arguments GGobi object # @arguments name of dataset to retrive # @arguments ignored # @arguments if TRUE, return vector is possible # @keyword manip # @alias [[.GGobi # @alias $.GGobi #X g <- ggobi(ChickWeight) #X g["cars"] <- mtcars #X g[1:2] #X g["ChickWeight"] #X g["cars"] #X g$cars "[.GGobi" <- function(x, i, ..., drop=TRUE) { d <- dataset(clean.ggobi(i), .gobi = x) if (drop && length(d) == 1 ) { d[[1]] } else { d } } "[[.GGobi" <- "$.GGobi" <- function(x, i) { x[i] } # Generic method for getting dataset # @keyword internal dataset <- function(x, .gobi = ggobi_get()) UseMethod("dataset", x) # Get ggobi dataset. # Get an object representing an internal ggobi dataset # # It is convenient to be able to refer to and operate on a ggobi # dataset as if it were a regular R dataset. This function allows one to # get an \code{GGobiData} object that represents a particular # dataset. # # @arguments which dataset to retrieve, an integer for positional matching or a character to match by name # @arguments GGobi instance # @value A list of \code{GGobiData} objects # @seealso \code{\link{$.GGobiData}} for user level selection of datasets # @keyword manip # @keyword internal # @alias dataset.character dataset.numeric <- function(x, .gobi = ggobi_get()) { refs <- .GGobiCall("getDataset", as.integer(x-1), .gobi=.gobi) refs <- lapply(refs, function(x) { if(is.null(x)) return() #class(x) <- c(class(x), "data.frame"); attr(x,"ggobi") <- .gobi x }) refs } dataset.character <- function(x, .gobi = ggobi_get()) { id <- match(x, names(.gobi)) if (any(is.na(id))) { stop(paste("Unrecognized dataset name", x[is.na(id)])) } dataset(id, .gobi) } # Write xml # Write GGobi xml for specific dataset to filename # # @arguments GGobiData object # @arguments path to write file to # @keyword manip # ggobi_data_write_xml <- function (gd, filename) { # refs <- lapply(.data, dataset, .gobi) # .GGobiCall("writeDatasetsXML", gd, as.character(filename)) # } rggobi/R/ggobi.r0000644000175100001440000001507712325763563013242 0ustar hornikusersggobi <- function(data=NULL, ...) UseMethod("ggobi", data) # New ggobi # Creates a new ggobi instance # # This function creates a new instance of GGobi with or without new data. Use # this function whenever you want to create a new GGobi indepdent of the # others---they will not share linked plots. If you want to add # another dataset to an existing ggobi, please see \code{\link{[<-.GGobi}} # # There are currently three basic types of functions that you # can use with rggobi: # # \itemize{ # \item Data getting and setting: see \code{\link{[.GGobi}}, and \code{\link{[.GGobiData}} # \item "Automatic" brushing: see \code{\link{glyph_colour}}, # \code{\link{glyph_size}}, \code{\link{glyph_type}}, # \code{\link{shadowed}}, \code{\link{excluded}}, and the associated # setter functions. # \item Edge modifcation: see \code{\link{edges}}, \code{\link{edges<-}}, # \code{\link{ggobi_longitudinal}} # } # # You will generally spend most of your time working with # \code{ggobdata}s, you retrieve using \code{\link{$.GGobiData}}, # \code{\link{[.GGobiData}}, or \code{\link{[[.GGobiData}}. # Most of the time these will operate like normal R datasets while # pointing to the data in GGobi so that all changes are kept in sync. # If you need to force a ggobiDaataset to be an R \code{data.frame} use # \code{\link{as.data.frame}}. # # @arguments the name of a file containing the data, or a data frame or matrix containing the values # @arguments a character vector of command-line arguments # @arguments data format GGobi should expect to read the data from, if reading from a file. # @arguments the name to use in GGobi for the dataset, if one is specified # @arguments ignored # @value A ggobi object # @keyword dynamic # @alias rggobi # @alias ggobi #X ggobi(ggobi_find_file("data", "flea.csv")) #X ggobi(ggobi_find_file("data", "flea.xml")) #X ggobi(mtcars) #X mtcarsg <- ggobi_get()$mtcars #X glyph_colour(mtcarsg) #X glyph_colour(mtcarsg) <- ifelse(mtcarsg$cyl < 4, 1, 2) #X glyph_size(mtcarsg) <- mtcarsg$cyl ggobi.default <- function(data, args=character(0), mode=character(0), name = deparse(sys.call()[[2]]), ...) { filename <- character(0) if(!missing(data) && is.character(data) && file.exists(data)) { filename <- path.expand(data) } args <- c(file.path(getwd(),"rggobi"), "--keepalive", as.character(args), as.character(mode), filename) ok <- .Call(.ggobi.symbol("init"), args, TRUE, PACKAGE = "rggobi") if(!is.null(ok) && !missing(data) && length(filename) == 0) { name <- force(name) ok[name] <- data } invisible(ok) } # GGobi names # Get dataset names # # @arguments ggobi instance # @keyword dynamic #X g <- ggobi(mtcars) #X names(g) names.GGobi <- function(x) { .GGobiCall("getDatasetNames", .gobi=x) } # Clean ggobi # Clean arguments for ggobi # # Arguments for ggobi need to be in specific format. # This function helps ensure that. # # @arguments vector # @keyword dynamic # @keyword internal clean.ggobi <- function(x) { if (is.numeric(x)) { as.integer(x) } else { as.character(x) } } # Print ggobi # Prints summary of ggobi object by instance # # @arguments ggobi object # @seealso \code{\link{summary.GGobi}} # @keyword dynamic # @keyword internal print.GGobi <- function(x, ...) { print(summary(x)) } # GGobi summary # Get a description of the global state of the GGobi session. # # @arguments ggobi object # @arguments ignored # @keyword dynamic #X g <- ggobi(mtcars) #X summary(g) summary.GGobi <- function(object, ...) { ans <- .GGobiCall("getDescription", .gobi = object) if (is.null(ans)) return("Nothing known about this GGobi instance") dimnames(ans$"Data dimensions") <- list(ans$Fileame, c("nrow", "ncol")) ans } # Close GGobi instance # Terminates and discards a ggobi instance # # This allows the caller to close a ggobi instance and discard the # resources it uses. The function closes the display windows and # variable panel window associated with this ggobi instance. # It also resets the default ggobi instance to be the last # one created. # # @arguments ggobi object to close # @arguments ignored and for compatability generic function. # @keyword dynamic #X g1 <- ggobi(mtcars) #X g2 <- ggobi(mtcars) #X close(g2) #X close(ggobi_get()) close.GGobi <- function(con, ...) { ok <- .GGobiCall("close", .gobi = con) invisible(ok) } # Get number of GGobis # Retrieves the number of ggobi instances within this session # # One or more ggobi instances can be created within an R session so that one # can simultaneously look at different datasets or have different views # of the same dataset. This function returns the number of ggobis in existence. # # The different ggobi instances are maintained as C level structures. # This function accesses a variable that stores how many are in existence # when the function is invoked. # # @keyword dynamic #X ggobi_count() ggobi_count <- function() { .GGobiC("getNumGGobiInstances", num = as.integer(-1), .gobi=NULL)$num } # Get GGobi # Returns a ggobi reference # # This allows one to get a list of all the ggobi instances currently # in existence in the R session. Also, one can fetch particular instances. # # @arguments numeric vector indicating which ggobi instances to retrieve. Use default if none specified # @arguments drop if possible? # @returns list of ggobi instances # @keyword dynamic #X ggobi(mtcars) #X ggobi(Nile) #X ggobi_get(1) #X ggobi_get(1:2) ggobi_get <- function(id = ggobi_count(), drop=TRUE) { ggobis <- .GGobiCall("getGGobi", as.integer(id), .gobi=NULL) if (drop && length(ggobis) == 1) return(ggobis[[1]]) ggobis } # Get version # GGobi version information # # Return an object that describes the version of the ggobi # library being used. This allows code to execute # conditionally on certain version numbers, etc. # # @value date the release date of the ggobi library # @value version a vector of 3 integers containing the major, minor and patch-level numbers. # @value versionstring a string version of the major, minor and patch-level numbers, # @keyword dynamic #X ggobi_version() ggobi_version <- function() { info <- .GGobiCall("getVersionInfo", .gobi=NULL) names(info) <- c("date", "version", "version string") names(info$version) <- c("major", "minor", "patch") info } # Find GGobi file. # Finds a file stored somewhere in the ggobi installation. # # @arguments bits of the path to join together # @keyword dynamic # @keyword internal #X ggobi_find_file("data","tips.xml") ggobi_find_file <- function(..., check = F) { file <- .GGobiCall("ggobi_find_data_file", file.path(...)) if(check && !file.exists(file)) stop("Cannot find file ", file) file }rggobi/R/display.r0000644000175100001440000001152412325763563013611 0ustar hornikusers# View displays # See methods for details # # @keyword internal displays <- function(x) UseMethod("displays", x) # Get GGobi displays # Gets list of displays in the specified GGobi instance # # A display basically corresponds to a window in GGobi. A display # may contain mutliple plots within it. For example, the scatterplot # matrix contains $p * p$ plots. # # Use this function to obtain a reference to a display (they are # numbered in the order they are created) so you can change # display mode, set variables (\code{\link{variables<-.GGobiDisplay}}), # or save a static image to disk. # # @seealso \code{\link{display}} to create displays # @alias displays.GGobi # @arguments GGobi object # @keyword dynamic #X g <- ggobi(mtcars) #X displays(g) #X display(g[1]) #X displays(g) displays.GGobi <- function(x) { .GGobiCall("getDisplays", .gobi = x) } # Get display dataset # Returns a link to the GGobiData (dataset) object associated with this display. # # See \code{\link{[.GGobi}} for more information on # # @arguments GGobiDisplay object # @arguments ggobi reference # @keyword manip #X g <- ggobi(mtcars) #X d <- displays(g)[[1]] #X dataset(d) dataset.GGobiDisplay <- function(x, .gobi=ggobi(x)) { .GGobiCall("getDisplayDataset", x, .gobi=.gobi) } # Get display GGobi # Returns a link to the GGobi object associated with this display # # @arguments GGobiDisplay object # @keyword internal ggobi.GGobiDisplay <- function(data, ...) { .GGobiCall("getGGobiForDisplay", data) } # Print method for GGobiDisplay # Shows display type (first element in class vector) # # @arguments GGobiDisplay object # @keyword internal print.GGobiDisplay <- function(x, ...) { print(class(x)[1]) } # Close display # Closes the referenced display. The R variable will be invalid after this call. # # @arguments GGobiDisplay object to close # @keyword internal #X g <- ggobi(mtcars) #X displays(g) #X close(displays(g)[[1]]) #X displays(g) close.GGobiDisplay <- function(con, ...) { .GGobiCall("closeDisplay", con) } # Length method for GGobiDisplay # Returns the number of plots within a given display # # @arguments GGobiDisplay object from which to retrieve the number of plots # @keyword internal length.GGobiDisplay <- function(x) { .GGobiCall("getNumPlotsInDisplay", x) } # Save picture of plot (and window) to disk # This allows you to make a static copy of a GGobiDisplay. # # If you want to make publicaiton quality graphics, you should # probably use the DescribeDisplay plugin and package. This # will recreate a GGobiDisplay in R, and so can produce high-quality # vector (eg. pdf) output. See \url{http://www.ggobi.org/describe-display} # for more information # # @arguments GGobiDisplay to save # @arguments path to save to # @arguments type of file to save # @arguments if TRUE, save only plot, otherwise save surrounding GUI elements as well # @keyword hplot #X g <- ggobi(mtcars) #X ggobi_display_save_picture(displays(g)[[1]], "test.png") ggobi_display_save_picture <- function(display=displays(ggobi_get())[[1]], path="ggobi_display.png", filetype="png", plot.only = FALSE) { display_widget <- .ggobi_display_get_widget(as.RGtkObject(display)) if (plot.only) { if (inherits(display, "GGobiScatmatDisplay")) display_widget <- display_widget[[2]][[1]] display_widget <- display_widget[[2]][[3]][["widget"]] } if (boundGTKVersion() >= "2.14.0") drawable <- display_widget$getSnapshot() else drawable <- display_widget[["window"]] widget_size <- drawable$getSize() pixbuf <- gdkPixbufGetFromDrawable(src = drawable, cmap = NULL, src.x = 0, src.y = 0, dest.x = 0, dest.y = 0, width = widget_size$width, height = widget_size$height) pixbuf$save(path, filetype) invisible(path) } .ggobi_display_get_widget <- function(display) { .GGobiCall("getDisplayWidget", display) } # ========================================================= # Class methods # ========================================================= # GGobiDisplay types # Get list of GGobiDisplay types. An instance of GGobi must be open # # @arguments GGobi reference # @seealso \code{\link{ggobi_display_make_type}} # @keyword internal ggobi_display_types <- function() { .GGobiCall("getDisplayTypes", .gobi = ggobi_get()) } # Convert plot name to GGobi plot type # Used to convert between friendly plot name and internal GGobi name. # # @keyword internal ggobi_display_make_type <- function(type) { if(!inherits(type, "GType")) { types <- ggobi_display_types() id <- match(type, names(types)) if(is.na(id)) { id <- match(type, sapply(types, pmodes)) } if(is.na(id)) stop("Unrecognized plot type") type <- types[[id]] } type } rggobi/R/edges.r0000644000175100001440000000632712325777664013247 0ustar hornikusers # Get edges # Get edges for a dataset # # @arguments ggobi dataset # @value A matrix of edge pairs # @keyword manip edges <- function(x) { m <- .GGobiCall("getSymbolicEdges", x) if (ncol(m) == 2) colnames(m) <- c("source", "destination") m } # Get connecting edges # Get actual edges from application of edges dataset to target dataset. # # @arguments target ggobi dataset # @arguments ggobi dataset containing edges # @keyword manip connecting_edges <- function(x, y) { m <- .GGobiCall("getConnectedEdges", y, x) + 1 if (ncol(m) == 2) colnames(m) <- c("source", "destination") m } # Set edges # Generic method, see methods for more details # # @keyword internal "edges<-" <- function(x, value) UseMethod("edges<-", x) # Set edges # Set edges for a dataset. # # In GGobi, and edge dataset is a special type of dataset that has # two additional (hidden) columns which specification source and # destination row names. These rownames are compared to the row # names of the dataset in the current plot, and if any match, it # is possible to specify this dataset as an edge set to the plotted # datset. When this is done, edges will be drawn between points # specified by the edge dataset. # # To remove edges, set edges to NULL. # # @arguments GGobiData # @arguments matrix, data frame, or graph containing of edges. First column should be from edge, second column to edge. # @keyword manip # @seealso \code{\link{ggobi_longitudinal}} for creating edges which simulate time series plots #X cc<-cor(t(swiss),use="p", method="s") #X ccd<-sqrt(2*(1-cc)) #X a <- which(lower.tri(ccd), arr.ind=TRUE) #X src <- row.names(swiss)[a[,2]] #X dest <- row.names(swiss)[a[,1]] #X weight <- as.vector(as.dist(ccd)) #X gg <- ggobi(swiss) #X gg$cor <- data.frame(weight) #X edges(gg$cor) <- cbind(src, dest) #X edges(gg$cor) #X edges(gg$cor) <- NULL "edges<-.GGobiData" <- function(x, value) { if (is.null(value)) return(invisible(.GGobiCall("setEdges", character(0), character(0), FALSE, x))) # if(is(value, "graphNEL")) { # value <- matrix(graph::nodes(value)[t(graph::edgeMatrix(value))], ncol=2) # } src <- value[,1] dest <- value[,2] if (is.numeric(src)) src <- rownames(x)[src] if (is.numeric(dest)) dest <- rownames(x)[dest] .GGobiCall("setEdges", as.character(src), as.character(dest), FALSE, x) x } # Set edges # Set edges for a display # # This sets the dataset that a GGobiDisplay uses # to display edges. # # @arguments GGobiDisplay object # @arguments GGobiData object that contains edges # @keyword dynamic "edges<-.GGobiDisplay" <- function(x, value) { if (is.null(value)) { .GGobiCall("setDisplayEdges", list(x), value, FALSE, FALSE) } else { .GGobiCall("setDisplayEdges", list(x), value, FALSE, TRUE) } x } # Set edges # Create a new edges dataset and add to GGobi # # @arguments GGobi dataset # @arguments new edges # # @keyword dynamic "edges<-.GGobi" <- function(x, value) { name <- deparse(substitute(value)) # if(is(value, "graphNEL")) { # names <- graph::nodes(value) # value <- t(graph::edgeMatrix(value)) # value <- cbind(names[value[, 1]], names[value[, 2]]) # } df <- data.frame(id=1:nrow(value)) rownames(df) <- paste(name, 1:nrow(df), sep="") x[[name]] <- df y <- x[[name]] edges(y) <- value x } rggobi/R/colorSchemes.r0000644000175100001440000000141612325763563014571 0ustar hornikusers# Set active colour scheme. # Specify the active color scheme in a GGobi instance or the session options. # # This makes a particular color scheme active within a GGobi instance. # # @arguments GGobi object # @arguments colour scheme to make active # @value The name of the previously active color scheme. # @keyword color #X g <- ggobi(mtcars) #X colorscheme(g) <- "Set1 8" #X colorscheme(g) <- 1 "colorscheme<-" <- function(x, value) { if(is.numeric(value)) value <- as.integer(value) .GGobiCall("setActiveColorScheme", value, .gobi = x) x } # Get active colour scheme # Get name of the active colour scheme # # @arguments GGobi object # @keyword color #X g <- ggobi(mtcars) #X colorscheme(g) colorscheme <- function(x) { .GGobiCall("getActiveColorScheme", .gobi = x) }rggobi/README.md0000644000175100001440000000123712326001566013024 0ustar hornikusers# rggobi ## Building from source For a fresh checkout, you'll need to run ``` aclocal autoconf ``` ## ggobi/rggobi on OS X Currently, the easiest way to get rggobi on OS X is to build Gtk2 and ggobi from source using homebrew. This is relatively simple: ``` # Install homebrew (if you don't already have it) ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" # Install ggobi from source brew install ggobi brew install libxml2 # Set up PKG_CONFIG_PATH so rggobi can find all the pieces PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig R install.packages("rggobi", type = "source") ``` rggobi/MD50000644000175100001440000002105612761623067012067 0ustar hornikusers94e9cdda510007aff84add1b2c8640ae *CHANGELOG 31b454882ff60a7a52ae78c7f0c82926 *DESCRIPTION 3b7be12ddf537eb8b937bb5a32f5338c *LICENSE cf9388448dddd1537d9807431e601266 *NAMESPACE 07feedd0473da86def41750321ac4c26 *NEWS 31e2cd98eeda7f4291283eb65f333fb8 *R/call.r e616badb7b504b05dd5e8cf8c396c3c4 *R/colorSchemes.r 67b755ab164360cf915047e55d9375a0 *R/data.r 311c90b4313cdabca611633c1b32674d *R/datasets.r 54a55fa4df9bcf05ab59347ea5e22edc *R/display-modes.r b2d14be8e20cc958846632897daab0fb *R/display-tour.r da5bc63f57888b7ee165050ebef809cc *R/display-variables.r b5d8b1964cd6c60f4fbc7bc66bed8a62 *R/display.r d1cbd23ed6d93fb9c9735cf58d377e43 *R/edges.r 016431cbe4912215fe3d98a44714ce0b *R/ggobi.r 5a72bf383dc70b19f9d08ade74c46dbd *R/glyphs.r 0385a8d7a3ced79fb573291ec9acdff9 *R/gtk.r ec32a099c3c6a9e48ed9afcebbd8ad6a *R/longitudinal.r 05d4303c1e82e94d4de96ab0142f006c *R/next-version/PlotDescriptions.S db00eef69d6b55608dbd2d436c59f8c7 *R/next-version/brush.S bf0d3f8abdb413ea76c7594585a9d6f9 *R/next-version/brush.r 92238deb14173cf9a4b8264a43e2ee7b *R/next-version/colour-schemes.r 3a087acc9e15c1872678510759308ded *R/next-version/options.r 5e6ed9f747fcb2df15fbe9b61c22c724 *R/next-version/plotLayout.S 55aa97a67b2f52adba9176cf621b652a *R/plot.r d41d8cd98f00b204e9800998ecf8427e *R/utils.r 41ff4ef23bb435440d91f21f107dc030 *R/zzz.r 9eea065cbdfdd204c2d950f86b6f9985 *README.md 5b41a31b13ddd6bcf77c547569f90880 *cleanup 3ac8f04a8c6cfc52a56052ced9994e2d *configure ec766b97d4cb67e2146f43bae2753889 *configure.in d41d8cd98f00b204e9800998ecf8427e *configure.win 13c5d3a10d1098be7adc3897c916fdd1 *data/stormtracks.rda 616c70adb477616996a3116681a9a2bf *demo/00Index 2aca275a8e1ca4336d04ea581ac35bf6 *demo/ball.R f0a81eddc630110e9152f0d3605ac5d0 *man/GGobiCall-n1.rd f9f97db03d7b18915a2134f96363ed25 *man/GGobiData-class.rd 9370882dea7d1eabb79ba39b3502fdf3 *man/as-RGtkObject-8g.rd 68823d1d7ebc90338ea57ea164410aed *man/as-data-frame-GGobiData-i6.rd 91b1f36da32f5504424833bd6ffaf4d2 *man/check-versions-xs.rd 9d4a0819842c0bd1fdc366898c2c1e28 *man/clean-ggobi-bw.rd 2787fae50b200f4a1ba3711c07df6f57 *man/close-GGobi-kz.rd e16a5a57a146f0419ed92b7315e0a73e *man/close-GGobiDisplay-ke.rd d1750ad1805815886210c0ab856a29fb *man/colorscheme--b2.rd 8f22055351b3a6181639d5a2234d7e63 *man/colorscheme-6n.rd ce604c219e4371795e233e9f46eb3e78 *man/connecting-edges-vf.rd fc0111e25d3b2558b3a1d6432721342b *man/dataset-GGobiDisplay-gk.rd 6bb45537ac82d4518ceedd4e40c32352 *man/dataset-mn.rd 54f7e0a86e5d07a1e1e4f8429cdd2d4c *man/dataset-numeric-gd.rd 038efb715dfb611c810de6656082aacf *man/dim-GGobiData-ok.rd bafced2e563e9a884787f070ee8fc7d0 *man/dimnames---GGobiData-ds.rd 5c76cb4153c563697608515c72fdd6de *man/dimnames-GGobiData-x0.rd b5fa10c2935fce5d91c5be441c03f398 *man/display-GGobiData-vz.rd a2a6ac0fb455a23c52905f256bfbf97d *man/display-ce.rd eb33e69664b02a89715137624fa09f90 *man/displays-GGobi-n2.rd 53c634ec9868ce9b274b31ec3708cca2 *man/displays-kj.rd 8d6cf3150214f0ec07de1b5eb91316a0 *man/edges---GGobi-m7.rd 7e42cc241a52779e5085dac0d89d0fb1 *man/edges---GGobiData-qe.rd 88fd18bd592029f2d0a06ae89eadf2a2 *man/edges---GGobiDisplay-1y.rd cbff8ccfe7a4f9509a18cf6ca6939200 *man/edges--p8.rd 141b57d57b09beb112f045b096d78cbb *man/edges-lk.rd f44c0f7cf5a1acd48d13f68862e14863 *man/excluded---GGobiData-3z.rd b235d038588c0ddbffc0081b7246c0b4 *man/excluded-GGobiData-ic.rd fa0463785a884eb0652984ead96cf824 *man/excluded-ec.rd aba71cd4de71024fa463d5ff2991ad1c *man/get--GGobi-7p.rd 190b3ea21da15a99cdfb957338483ebd *man/get--GGobiData-9v.rd b231401c2662c2dc45d53e9fcecd3b64 *man/ggobi-GGobiDisplay-zh.rd 8fe988ff3ddacc1ab1c400c349ef8dc5 *man/ggobi-check-structs-qq.rd 36c962d80d3e62a2daf36bd8eaec7f1a *man/ggobi-count-u4.rd b0b2e7212fc71631f1e13e3a7ec78c65 *man/ggobi-data-add-variable-xu.rd f30a8d133351067b9900de5617e7d0bd *man/ggobi-data-remove-variable-bv.rd 2d7f127c9a4ef5bf6eae953a01354eac *man/ggobi-data-set-variable-43.rd 7b8f7286efa79ad6191ef53d1faea3c7 *man/ggobi-default-20.rd 6e41da3b42d33406603dfda5e5887a4c *man/ggobi-display-get-tour-projection-p0.rd 289a0743a78817861abda9b8493d45d4 *man/ggobi-display-make-type-3r.rd 521a7a81ef3e4a9a135cd5a4a86a22d0 *man/ggobi-display-save-picture-bw.rd 01924bd093248cf37276b5762f1a77c5 *man/ggobi-display-set-tour-projection-2n.rd 2dd4fbab3817f2c956b11d96c70e76d4 *man/ggobi-display-types-9g.rd 5fdb5256486f272a53c33be5c25def60 *man/ggobi-find-file-fe.rd 23a54059159afde690e8a540b28e6bda *man/ggobi-get-2m.rd 9cfbe9cba0ea697593ea4f1934aa2248 *man/ggobi-gtk-main-window-l6.rd dd0fb5159570b46be6cc0943d7f0ea15 *man/ggobi-gtk-menu-bar-j4.rd d6693f6b494269086b0fba5e7f56ffe6 *man/ggobi-longitudinal-2e.rd 48f444512bc8b16b0b02bcb682452afa *man/ggobi-pcp-c7.rd 65a57c7295f0f9c5f5377e4870df5720 *man/ggobi-set-data-file-be.rd 684f3316367284fbc7d9c33d918fd0a4 *man/ggobi-set-data-frame-vy.rd 63f07818029ac720c562a7b2ad4183e6 *man/ggobi-symbol-ec.rd 8527e18b97397a6158e82883cd392d16 *man/ggobi-version-ao.rd 1bc62603d4359c914d05f3e78d75219a *man/glyph-colour---GGobiData-u7.rd 668d1a6a09303c8fbdb16cf99c561e1d *man/glyph-colour-GGobiData-p2.rd b0dc9ffa29a7060db537b942fbbda984 *man/glyph-size---GGobiData-9w.rd 6c93bb9715a253c56a35a1a0e529a315 *man/glyph-size-GGobiData-3t.rd e796b922bfc24da55b49f3c615e1febb *man/glyph-type---GGobiData-r1.rd cb4f7abffc86afe06d308c758285ae38 *man/glyph-type-GGobiData-og.rd 9485d1127837336c0316336e687a166f *man/ids---GGobiData-mw.rd 2394d31b1a627a97c09542dda3c989eb *man/ids-GGobiData-yu.rd 31129c733a7bbb16896fc7a48d1d9612 *man/imode-8g.rd f72eecee430b705922c9ca6a0113466c *man/length-GGobiDisplay-gt.rd 6448912ed4f4f38e56a41b8d682093ca *man/mapGlyphType-t9.rd 1c255f03b5c66ceec025424704ac5ea3 *man/names---GGobiData-p2.rd 4e8619134ce5db30c5351a93ab80cc0e *man/names-GGobi-pt.rd 125ed36861574927021874034154896c *man/names-GGobiData-c0.rd 41aa8d5e109d81432068bbe4389a8146 *man/ncol-GGobiData-p3.rd 2714ba3d48e54ddb387ec18f97b49ca6 *man/nrow-GGobiData-om.rd cdb498dcaa42a9b5f8ee17e1cf60bb84 *man/pmode-ix.rd 42eda8fb07b7881d7284b6cf5c88706d *man/pmodes-tc.rd 284c7af44d6c380943c106d6a9c17dc1 *man/print-GGobi-yo.rd 8389cf19753b32fe8bc3ef263ac49014 *man/print-GGobiData-ja.rd fab8939cc98698bed611a5c657865719 *man/print-GGobiDisplay-o0.rd 43df4d96c5b081ce1effeb7bc5b21421 *man/rownames---GGobiData-rg.rd a4b73ed722249ede5c6bfd160d1ebe5c *man/rownames-GGobiData-pv.rd f99ab311ebc5e038cdd5949a6041327c *man/selected-GGobiData-xv.rd f0fa550fc27e1c19293c795644f70335 *man/set--GGobi-b7.rd 07f8aa368aef19d9a9a5821971c2381d *man/set--GGobiData-56.rd bcea81991be0de057f97f8dff120a6ec *man/shadowed---GGobiData-h7.rd a61c4cccf1e07710939c41acd6792b33 *man/shadowed-GGobiData-8b.rd f596c073b6bf501a87056d00e44de3f6 *man/stormtracks.rd 332b4349acc56c195f80952d9099d779 *man/summary-GGobi-c4.rd b15a6fba1207a7edd8f9e2137dd9d5d2 *man/summary-GGobiData-mm.rd 0c0f2a666f97da89cf5db695520c877a *man/valid-ggobi-uv.rd 90763938eaba45b89c04db5afdba44d7 *man/variable-index-h9.rd 101553a3f22a26b3809dd57647d7a0af *man/variables---GGobiDisplay-a6.rd 9c24f1b24c5c87b9940a4b8d482e3f3d *man/variables--1i.rd 9f20ce466f432a36257e2c4ec505491e *man/variables-2n.rd 5b9ea364220c39d4add9bade3d83638a *man/variables-GGobiDisplay-si.rd 8714741b29d2bb4b78a671eb5a50f866 *src/Makevars.in a072d75110bada2a34f328d6613b3e6c *src/Makevars.win dc084c23e20ebc5f9f0fb30598a529fc *src/Makevars.win.in be32057fe503d87e729ca93a9a4bf424 *src/RSCommon.h 6f22dd2a91d8cda1d65aa52b72114a8d *src/RSEval.c fc2d03d36b41859f9b6c16b0dc61f93b *src/RSEval.h 898331525f80977e3aecf4cbd8328fa5 *src/RSGGobi.h b733f3a34d455cf55b56f93e857054fd *src/RSGGobiEntryPoints.h 56779df7e232cecb4958e182e415d3c6 *src/RUtils.h 719f3c89810b429acbbb1f20c8f9b1ca *src/brush.c 143991dae3ae6948c9a9678eb22bd1d9 *src/colorSchemes.c d4ad43d88109eb868e38b15c5f1ae86f *src/conversion.c 451f9a423663f768e9702b9515945e6f *src/conversion.h 08f0a0a8e8e2aa953493baf7664f8926 *src/data.c e6deb4bd65e16b0508249b3ebf601683 *src/dataset.c ba19f106705199bd1cfc54779b284977 *src/display.c b9315a20f1a87f1435b59c71a8ed8679 *src/displays.c 00f0c2bad68a6c301521ffc43904694c *src/edges.c 2821878c346ef971ebd7af70380d969a *src/ggobi.c 501be43af639d7b287d4584b50776148 *src/identify.c fd1d70ddaa6251c9368e9739264a37d6 *src/init.c f8f56656cd7050d9d01994a83e7c2013 *src/io.c 1686daeaefab0044430ff91e2ec3733d *src/keyHandlers.c d0fa4946683419cc6801de172693ad88 *src/longitudinal.c 36fd4e26538d7d33e57c82bad999814e *src/modes.c d25a27912485495e9e102b95636a947b *src/plot.c cb71f5162d11f3c59e9f38ed82939bdf *src/plots.c 5d8cccfd448ef21b7aa9688fc13dcd91 *src/plugins.c 7bbc173f2941deaf4f7fc5208084cfbd *src/print.c 1f1493e84b0163de8263e0f8cec0543f *src/session.c 1bd91a4c39b00cd10b6733bea83577cd *src/smooth.c a8c26d5ee1663a26f915cf8ed5cc004b *src/ui.c 515a4d2029d9c31e6f6f5b0aff95c16c *src/utils.c rggobi/DESCRIPTION0000644000175100001440000000165212761623067013265 0ustar hornikusersPackage: rggobi Version: 2.1.21 Title: Interface Between R and 'GGobi' Author: Duncan Temple Lang , Debby Swayne , Hadley Wickham , Michael Lawrence Maintainer: Hadley Wickham Description: A command-line interface to 'GGobi', an interactive and dynamic graphics package. 'Rggobi' complements the graphical user interface of 'GGobi' providing a way to fluidly transition between analysis and exploration, as well as automating common tasks. Depends: R (>= 2.5.1) Suggests: reshape, nlme Imports: RGtk2, utils SystemRequirements: GGobi License: BSD_3_clause + file LICENSE LazyData: true URL: http://www.ggobi.org/rggobi Acknowledgments: Di Cook, Nicholas Lewin-Koh, Xuejing Chen. NeedsCompilation: yes Packaged: 2016-08-31 13:30:21 UTC; hadley Repository: CRAN Date/Publication: 2016-08-31 20:47:19 rggobi/configure0000755000175100001440000026130612325774326013473 0ustar hornikusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="src/brush.c" ac_subst_vars='LTLIBOBJS LIBOBJS GGOBI_LIBS GGOBI_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_ggobi ' ac_precious_vars='build_alias host_alias target_alias PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GGOBI_CFLAGS GGOBI_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) Specify where ggobi pkgconfig file is located Some influential environment variables: PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GGOBI_CFLAGS C compiler flags for GGOBI, overriding pkg-config GGOBI_LIBS linker flags for GGOBI, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --with-ggobi was given. if test "${with_ggobi+set}" = set; then : withval=$with_ggobi; GGOBI_ROOT=$withval fi if ! test -z "${GGOBI_ROOT}"; then export PKG_CONFIG_PATH=${GGOBI_ROOT}:$PKG_CONFIG_PATH fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GGOBI" >&5 $as_echo_n "checking for GGOBI... " >&6; } if test -n "$GGOBI_CFLAGS"; then pkg_cv_GGOBI_CFLAGS="$GGOBI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ggobi >= 2.1.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "ggobi >= 2.1.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GGOBI_CFLAGS=`$PKG_CONFIG --cflags "ggobi >= 2.1.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GGOBI_LIBS"; then pkg_cv_GGOBI_LIBS="$GGOBI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ggobi >= 2.1.6\""; } >&5 ($PKG_CONFIG --exists --print-errors "ggobi >= 2.1.6") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GGOBI_LIBS=`$PKG_CONFIG --libs "ggobi >= 2.1.6" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GGOBI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ggobi >= 2.1.6" 2>&1` else GGOBI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ggobi >= 2.1.6" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GGOBI_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (ggobi >= 2.1.6) were not met: $GGOBI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GGOBI_CFLAGS and GGOBI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GGOBI_CFLAGS and GGOBI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GGOBI_CFLAGS=$pkg_cv_GGOBI_CFLAGS GGOBI_LIBS=$pkg_cv_GGOBI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi rggobi/man/0000755000175100001440000000000012325776642012332 5ustar hornikusersrggobi/man/ggobi-symbol-ec.rd0000644000175100001440000000100012325776642015627 0ustar hornikusers\name{.ggobi.symbol} \alias{.ggobi.symbol} \title{GGobi symbol creation} \author{Hadley Wickham } \description{ Maps the given name to the name of the corresponding C routine } \usage{.ggobi.symbol(name)} \arguments{ \item{name}{} } \value{the name of the C routine corresponding to its argument} \details{A simple way of generating the prefix for a symbol used in this package/library so that we can hide it from other packages and avoid conflicts.} \keyword{dynamic} \keyword{internal} rggobi/man/variables---GGobiDisplay-a6.rd0000644000175100001440000000226112325776642017603 0ustar hornikusers\name{"variables<-.GGobiDisplay"} \alias{variables<-.GGobiDisplay} \title{Set display variables} \author{Hadley Wickham } \description{ Set display variables with a list of x, y, and z component variable indices. } \usage{\S3method{variables}{GGobiDisplay}(x) <- value} \arguments{ \item{x}{GGobiDisplay object} \item{value}{list with X, Y and Z components listing the variable indices to display, either as numeric position or character variable name} } \details{There are three types of variables in GGobi displays: x, y, z, which correspond to the labels on the toggle buttons in GGobi. Most plots have a constrained set of possible options. For example, in tours you can only set x variables, and you must have at least three. Or in the rotation plot, you need exactly one x, y, and z variable. Currently, there is no checking done to ensure that you are sending a sensible set of variables for the given display type. Generally, any invalid choices will be silently ignored.} \examples{g <- ggobi(mtcars) d <- display(g[1], "Parallel Coordinates Display") variables(d) variables(d) <- list(X=1:8) variables(d) <- list(X=c("mpg", "cyl")) variables(d)} \keyword{dynamic} rggobi/man/ggobi-display-types-9g.rd0000644000175100001440000000053712325776642017077 0ustar hornikusers\name{ggobi_display_types} \alias{ggobi_display_types} \title{GGobiDisplay types} \author{Hadley Wickham } \description{ Get list of GGobiDisplay types. An instance of GGobi must be open } \usage{ggobi_display_types()} \arguments{ \item{}{GGobi reference} } \seealso{\code{\link{ggobi_display_make_type}}} \keyword{internal} rggobi/man/glyph-colour-GGobiData-p2.rd0000644000175100001440000000053312325776642017404 0ustar hornikusers\name{glyph_colour.GGobiData} \alias{glyph_colour.GGobiData} \alias{glyph_colour} \alias{glyph_color} \title{Get glyph colour} \author{Hadley Wickham } \description{ Get glyph colour } \usage{\S3method{glyph_colour}{GGobiData}(x)} \arguments{ \item{x}{GGobiData} } \seealso{\code{\link{glyph_colour<-}}} \keyword{dynamic} rggobi/man/ggobi-display-get-tour-projection-p0.rd0000644000175100001440000000151012325776642021643 0ustar hornikusers\name{ggobi_display_get_tour_projection} \alias{ggobi_display_get_tour_projection} \title{Get tour projection} \author{Hadley Wickham } \description{ Get the tour projection from a GGobi tour. } \usage{ggobi_display_get_tour_projection(gd)} \arguments{ \item{gd}{GGobiDisplay object running tour} } \details{This function retrieves the current projection matrix from a paused tour. (The tour must be paused so that R can run commands). This can be used to record interesting projections of your data for later analysis.} \examples{g <- ggobi(mtcars) d <- displays(g)[[1]] \dontrun{ pmode(d) <- "2D Tour" ggobi_display_get_tour_projection(d) variables(d) <- list(X=names(mtcars)) ggobi_display_get_tour_projection(d) MASS::eqscplot(as.matrix(mtcars) \%*\% ggobi_display_get_tour_projection(d)) }} \keyword{dynamic} rggobi/man/stormtracks.rd0000644000175100001440000000430212325776642015234 0ustar hornikusers\name{Storm tracks data} \docType{data} \alias{stormtracks} \title{Storm tracks in the Caribbean} \description{ The data consist of tropical cyclone tracks through the Atlantic Ocean, Caribbean Sea and Gulf of Mexico from 1995 to 2005. Only ``named'' storms, those which reached tropical storm status or stronger, are included. The data originated from the National Hurricane Center's archive of Tropical Cyclone Reports ( \url{http://www.nhc.noaa.gov/pastall.shtml}). From the NHC, the reports "contain comprehensive information on each tropical cyclone, including synoptic history, meteorological statistics, casualties and damages, and the post-analysis best track (six-hourly positions and intensities)." This dataset is taken from the post-analysis best track information, which are presented in tabular form in the Tropical Cyclone Reports and came in a variety of electronic formats (PDF, HTML and Microsoft Word documents). The best track tables were then copied to text files and parsed into the comma-separated format in which they currently reside. The variables are as follows: \itemize{ \item Name: Storm Name \item Year: Year of report \item Month: Month of report \item Day: Day of report (day of the month) \item Hour: Hour of report (0, 6, 12 or 18 in UTC time) \item Latitude: Latitude of the storm's center (degrees North) \item Longitude: Longitude of the storm's center (degrees West) \item Pressure: Air pressure at the storm's center (millibars) \item Wind: Storm's maximum sustained wind speed (knots or nautical miles per hour) \item Type: Storm classification (Tropical Depression, Tropical Storm, Hurricane, \item Extratropical) \item SeasDay: Day of the hurricane season (days since June 1) } The Tropical Cyclone Reports had a variety of storm type designations and there appeared to be no consistent naming convention for cyclones that were not hurricanes, tropical depressions, or tropical storms. Many of these designations have been combined into the "Extratropical" category in this dataset. This data was put together by Jon Hobbs, a PhD student at Iowa State. Thanks Jon! } \usage{data(stormtracks)} \format{A data frame with 5519 rows and 24 variables} \keyword{datasets} rggobi/man/GGobiCall-n1.rd0000644000175100001440000000263712325776642014770 0ustar hornikusers\name{.GGobiCall} \alias{.GGobiCall} \alias{.GGobiC} \title{Calling native routines} \author{Hadley Wickham } \description{ Wrappers for calling C routines in the R-ggobi library. } \usage{.GGobiCall(.name, ..., .gobi = ggobi_get(), .test=TRUE)} \arguments{ \item{.name}{the simple name of the C routine to be resolved} \item{...}{the arguments that to be passed to the \code{\link{.C}} or \code{\link{.Call}}} \item{.gobi}{the ggobi instance identifier that is to be passed to the C routine as its last argument} \item{.test}{} } \value{the same result as the corresponding \code{.C} and \code{.Call}} \details{\code{.GGobiC} and \code{.GGobiCall} convert the name and then call their C invocation counterparts. These functions map the simple name of a C routine into the package-specific version of that name. These allow use to hide the use a name \emph{mangling} scheme of our choosing for the C level routines in the shared library/DLL that provides the glue between R and ggobi. This is useful for avoiding name conflicts with other C code in R or other packages. These are only of relevance to the developers of this package and those working with its C code. The mapping of the name to its corresponding C routine name is done in conjunction with the pre-processor macro \code{RS_GGOBI}. These must be synchronized.} \seealso{\code{\link{.C}}, \code{\link{.Call}}} \keyword{dynamic} \keyword{internal} rggobi/man/get--GGobi-7p.rd0000644000175100001440000000130612325776642015026 0ustar hornikusers\name{"[.GGobi"} \alias{[.GGobi} \alias{[[.GGobi} \alias{$.GGobi} \title{Get ggobi data.} \author{Hadley Wickham } \description{ Conveniently retrieve ggobi dataset. } \usage{\S3method{[}{GGobi}(x, i, ..., drop=TRUE)} \arguments{ \item{x}{GGobi object} \item{i}{name of dataset to retrive} \item{...}{ignored} \item{drop}{if TRUE, return vector is possible} } \details{It is convenient to be able to refer to and operate on a ggobi dataset as if it were a regular R dataset. This function allows one to get an \code{GGobiData} object that represents a particular dataset.} \examples{g <- ggobi(ChickWeight) g["cars"] <- mtcars g[1:2] g["ChickWeight"] g["cars"] g$cars} \keyword{manip} rggobi/man/ggobi-display-make-type-3r.rd0000644000175100001440000000051012325776642017623 0ustar hornikusers\name{ggobi_display_make_type} \alias{ggobi_display_make_type} \title{Convert plot name to GGobi plot type} \author{Hadley Wickham } \description{ Used to convert between friendly plot name and internal GGobi name. } \usage{ggobi_display_make_type(type)} \arguments{ \item{type}{} } \keyword{internal} rggobi/man/display-GGobiData-vz.rd0000644000175100001440000000313012325776642016537 0ustar hornikusers\name{display.GGobiData} \alias{display.GGobiData} \title{Create a new display} \author{Hadley Wickham } \description{ Create a new display for the GGobiData object. } \usage{\S3method{display}{GGobiData}(x, pmode="Scatterplot Display", vars=list(X=names(x)), embed=FALSE, ...)} \arguments{ \item{x}{GGobiData object} \item{pmode}{projection mode to use} \item{vars}{variables to display, see \code{\link{variables.GGobiDisplay}} for details} \item{embed}{If TRUE, returns widget for use with RGtk2} \item{...}{ignored} } \details{This function allows you to create a new display from a GGobiData object. You will need to specify the type of display you want ("Scatterplot Display", "Scatterplot Matrix" and "Parallel Coordinates Display" are the most common), and which variables the plot should be intialised with. Specifying more than two variables only makes sense for scatterplot matrices and pcps. Many of the plots used in GGobi (eg. the tours and densities plots) are special modes of the scatterplot display. You will need to create a new scatterplot display, change the projection mode to what you want, and then set the variables. Hopefully this will be improved in a future version of rggobi.} \seealso{\code{\link{ggobi_display_types}} for a list of display types} \examples{g <- ggobi(mtcars) display(g[1]) display(g[1], vars=list(X=4, Y=5)) display(g[1], vars=list(X="drat", Y="hp")) display(g[1], "Parallel Coordinates Display") \dontrun{ display(g[1], "2D Tour") display(g[1], "2x1D Tour", list(X=c(1,2,3), Y=c(4,5,6))) } display(g[1], "Scatterplot Matrix")} \keyword{dynamic} rggobi/man/summary-GGobi-c4.rd0000644000175100001440000000055312325776642015652 0ustar hornikusers\name{summary.GGobi} \alias{summary.GGobi} \title{GGobi summary} \author{Hadley Wickham } \description{ Get a description of the global state of the GGobi session. } \usage{\S3method{summary}{GGobi}(object, \dots)} \arguments{ \item{object}{ggobi object} \item{\dots}{ignored} } \examples{g <- ggobi(mtcars) summary(g)} \keyword{dynamic} rggobi/man/ggobi-find-file-fe.rd0000644000175100001440000000061112325776642016171 0ustar hornikusers\name{ggobi_find_file} \alias{ggobi_find_file} \title{Find GGobi file.} \author{Hadley Wickham } \description{ Finds a file stored somewhere in the ggobi installation. } \usage{ggobi_find_file(..., check = F)} \arguments{ \item{...}{bits of the path to join together} \item{check}{} } \examples{ggobi_find_file("data","tips.xml")} \keyword{dynamic} \keyword{internal} rggobi/man/nrow-GGobiData-om.rd0000644000175100001440000000043612325776642016041 0ustar hornikusers\name{nrow.GGobiData} \alias{nrow.GGobiData} \title{GGobiData rows} \author{Hadley Wickham } \description{ Retrieve the number of row in a GGobiData } \usage{\S3method{nrow}{GGobiData}(d)} \arguments{ \item{d}{dataset} } \keyword{attribute} \keyword{internal} rggobi/man/check-versions-xs.rd0000644000175100001440000000036612325776642016241 0ustar hornikusers\name{.check_versions} \alias{.check_versions} \title{check that rggobi and GGobi by major.minor versions are the same} \author{Hadley Wickham } \description{ to ensure binary compatibility } \usage{.check_versions()} rggobi/man/ggobi-data-set-variable-43.rd0000644000175100001440000000063112325776642017457 0ustar hornikusers\name{ggobi_data_set_variable} \alias{ggobi_data_set_variable} \title{Set variable values} \author{Hadley Wickham } \description{ Set the variable values for a column in a GGobiData } \usage{ggobi_data_set_variable(x, vals, var, update = TRUE)} \arguments{ \item{x}{GGobiData} \item{vals}{values of new variable} \item{var}{variable name} \item{update}{update?} } \keyword{internal} rggobi/man/as-RGtkObject-8g.rd0000644000175100001440000000035112325776642015573 0ustar hornikusers\name{as.RGtkObject} \alias{as.RGtkObject} \title{RGtk casting} \author{Hadley Wickham } \description{ Cast an object to an RGtk object } \usage{as.RGtkObject(x)} \arguments{ \item{x}{} } \keyword{internal} rggobi/man/displays-kj.rd0000644000175100001440000000032212325776642015110 0ustar hornikusers\name{displays} \alias{displays} \title{View displays} \author{Hadley Wickham } \description{ See methods for details } \usage{displays(x)} \arguments{ \item{x}{} } \keyword{internal} rggobi/man/ggobi-data-add-variable-xu.rd0000644000175100001440000000057312325776642017627 0ustar hornikusers\name{ggobi_data_add_variable} \alias{ggobi_data_add_variable} \alias{addVariable} \title{Add variable} \author{Hadley Wickham } \description{ Add variable to a GGobiData } \usage{ggobi_data_add_variable(x, vals, name, ...)} \arguments{ \item{x}{GGobiData} \item{vals}{values to add} \item{name}{name of column to add} \item{...}{} } \keyword{internal} rggobi/man/pmode-ix.rd0000644000175100001440000000117612325776642014410 0ustar hornikusers\name{pmode} \alias{pmode} \alias{pmode<-} \title{Projection mode} \author{Hadley Wickham } \description{ Functions to get and set projection mode } \usage{pmode(x)} \arguments{ \item{x}{GGobiDisplay object} } \details{In GGobi, the projection mode determines the type of plot that is displayed. For example, a 1D ASH plot, or a 2D tour. You can see the list of available projection modes using the \code{\link{pmodes}} function. This accepts either a GGobiDisplay, or the name of the display type.} \examples{g <- ggobi(mtcars) d <- displays(g)[[1]] pmode(d) pmodes(d) pmode(d) <- "1D Plot"} \keyword{dynamic} rggobi/man/excluded---GGobiData-3z.rd0000644000175100001440000000062312325776642016722 0ustar hornikusers\name{"excluded<-.GGobiData"} \alias{excluded<-.GGobiData} \title{Set excluded status} \author{Hadley Wickham } \description{ Set the exclusion status of points. } \usage{\S3method{excluded}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{logical vector} } \details{If a point is excluded it is not drawn.} \seealso{\code{\link{excluded}}} \keyword{dynamic} rggobi/man/set--GGobi-b7.rd0000644000175100001440000000102512325776642015022 0ustar hornikusers\name{"[<-.GGobi"} \alias{[<-.GGobi} \alias{$<-.GGobi} \alias{[[<-.GGobi} \title{[<-.GGobi} \author{Hadley Wickham } \description{ Add data to ggobi instance. } \usage{\S3method{[}{GGobi}(x, i) <- value} \arguments{ \item{x}{ggobi instance} \item{i}{name of data frame} \item{value}{data.frame, or string to path of file to load} } \details{This function allows you to add (and eventually) replace GGobiData objects in a GGobi instance.} \examples{g <- ggobi() g["a"] <- mtcars g$b <- mtcars} \keyword{manip} rggobi/man/imode-8g.rd0000644000175100001440000000136412325776642014276 0ustar hornikusers\name{imode} \alias{imode} \alias{imode<-} \title{Interaction mode} \author{Hadley Wickham } \description{ Functions to get and set interaction mode } \usage{imode(x)} \arguments{ \item{x}{GGobiDisplay object} } \details{In GGobi, the interaction mode determines the how you interact with a plot: brushing, identify etc. Each projection mode also has a default interaction mode that allows you to select variables and control other parameters of the display You can see the list of available interaction modes using the \code{\link{imodes}} function. This accepts either a GGobiDisplay, or the name of the display type.} \examples{g <- ggobi(mtcars) d <- displays(g)[[1]] imode(d) imodes(d) imode(d) <- "Brush"} \keyword{dynamic} rggobi/man/ggobi-gtk-menu-bar-j4.rd0000644000175100001440000000056012325776642016553 0ustar hornikusers\name{ggobi_gtk_menu_bar} \alias{ggobi_gtk_menu_bar} \title{Gtk menu bar} \author{Hadley Wickham } \description{ Retrieve RGtk object for menu bar } \usage{ggobi_gtk_menu_bar(.gobi = ggobi_get())} \arguments{ \item{.gobi}{} } \details{Useful for embedding in other applications or for listening to their signals via RGtk2.} \keyword{internal} rggobi/man/ggobi-set-data-frame-vy.rd0000644000175100001440000000105412326000221017142 0ustar hornikusers\name{ggobi_set_data_frame} \alias{ggobi_set_data_frame} \title{Set data frame.} \author{Hadley Wickham } \description{ Add data.frame to ggobi instance. } \usage{ggobi_set_data_frame(data, name = deparse(sys.call()[[2]]), description = paste("R data frame", name), id = NULL, .gobi = ggobi_get())} \arguments{ \item{data}{data frame to add} \item{name}{data set name (appears on tabs in ggobi)} \item{description}{description of data frame} \item{id}{rownames} \item{.gobi}{ggobi instance} } \keyword{manip} \keyword{internal} rggobi/man/ggobi-data-remove-variable-bv.rd0000644000175100001440000000045512325776642020346 0ustar hornikusers\name{ggobi_data_remove_variable} \alias{ggobi_data_remove_variable} \title{Remove variable} \author{Hadley Wickham } \description{ Remove variables from a GGobiData object } \usage{ggobi_data_remove_variable(x, var)} \arguments{ \item{x}{} \item{var}{} } \keyword{internal} rggobi/man/rownames-GGobiData-pv.rd0000644000175100001440000000046512325776642016723 0ustar hornikusers\name{rownames.GGobiData} \alias{rownames.GGobiData} \title{Get row names} \author{Hadley Wickham } \description{ Get row names for a GGobiData } \usage{\S3method{rownames}{GGobiData}(x)} \arguments{ \item{x}{ggobiDataget} \item{}{new names} } \keyword{attribute} \keyword{internal} rggobi/man/variables--1i.rd0000644000175100001440000000037712325776642015224 0ustar hornikusers\name{"variables<-"} \alias{variables<-} \title{Set variables} \author{Hadley Wickham } \description{ Set variable names in a container } \usage{"variables<-"(x, value)} \arguments{ \item{x}{} \item{value}{} } \keyword{internal} rggobi/man/ggobi-longitudinal-2e.rd0000644000175100001440000000204112325776642016740 0ustar hornikusers\name{ggobi_longitudinal} \alias{ggobi_longitudinal} \title{Create longitudinal dataset.} \author{Hadley Wickham } \description{ Instantiate new ggobi with a longitudinal data set. } \usage{ggobi_longitudinal(data, time=1:rows, id=rep(1, rows), g = NULL)} \arguments{ \item{data}{data frame} \item{time}{time variable} \item{id}{id variable} \item{g}{ggobi instance, if you don't want to create a new one} } \details{This function allows you to load longitudinal data in to GGobi and display it as a line plot. This is achieved by creating edges between adjacent time points, for a given id variable. For best viewing, we recommend that you turn the show points off in the options menu. When brushing, you may also want to use categorical brushing on the id variable, so that the entire series is selected for an observation.} \examples{data(Oxboys, package="nlme") ggobi_longitudinal(Oxboys, Occasion, Subject) ggobi_longitudinal(stormtracks, seasday, id) ggobi_longitudinal(data.frame(x=1:100, y=sin(1:100)))} \keyword{dynamic} rggobi/man/ggobi-get-2m.rd0000644000175100001440000000107712325776642015046 0ustar hornikusers\name{ggobi_get} \alias{ggobi_get} \title{Get GGobi} \author{Hadley Wickham } \description{ Returns a ggobi reference } \usage{ggobi_get(id = ggobi_count(), drop=TRUE)} \arguments{ \item{id}{numeric vector indicating which ggobi instances to retrieve. Use default if none specified} \item{drop}{drop if possible?} } \details{This allows one to get a list of all the ggobi instances currently in existence in the R session. Also, one can fetch particular instances.} \examples{ggobi(mtcars) ggobi(Nile) ggobi_get(1) ggobi_get(1:2)} \keyword{dynamic} rggobi/man/names---GGobiData-p2.rd0000644000175100001440000000050312325776642016212 0ustar hornikusers\name{"names<-.GGobiData"} \alias{names<-.GGobiData} \title{Set column names} \author{Hadley Wickham } \description{ Set column names for a GGobiData } \usage{\S3method{names}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{new names} } \keyword{attribute} \keyword{internal} rggobi/man/variable-index-h9.rd0000644000175100001440000000047512325776642016077 0ustar hornikusers\name{variable_index} \alias{variable_index} \title{Variable index} \author{Hadley Wickham } \description{ Return indices corresponding to variable names } \usage{variable_index(x, names)} \arguments{ \item{x}{GGobiData} \item{names}{variable names} } \keyword{attribute} \keyword{internal} rggobi/man/ggobi-default-20.rd0000644000175100001440000000414412325776642015614 0ustar hornikusers\name{ggobi.default} \alias{ggobi.default} \alias{rggobi} \alias{ggobi} \title{New ggobi} \author{Hadley Wickham } \description{ Creates a new ggobi instance } \usage{\S3method{ggobi}{default}(data, args=character(0), mode=character(0), name = deparse(sys.call()[[2]]), ...)} \arguments{ \item{data}{the name of a file containing the data, or a data frame or matrix containing the values} \item{args}{a character vector of command-line arguments} \item{mode}{data format GGobi should expect to read the data from, if reading from a file.} \item{name}{the name to use in GGobi for the dataset, if one is specified} \item{...}{ignored} } \value{A ggobi object} \details{This function creates a new instance of GGobi with or without new data. Use this function whenever you want to create a new GGobi indepdent of the others---they will not share linked plots. If you want to add another dataset to an existing ggobi, please see \code{\link{[<-.GGobi}} There are currently three basic types of functions that you can use with rggobi: \itemize{ \item Data getting and setting: see \code{\link{[.GGobi}}, and \code{\link{[.GGobiData}} \item "Automatic" brushing: see \code{\link{glyph_colour}}, \code{\link{glyph_size}}, \code{\link{glyph_type}}, \code{\link{shadowed}}, \code{\link{excluded}}, and the associated setter functions. \item Edge modifcation: see \code{\link{edges}}, \code{\link{edges<-}}, \code{\link{ggobi_longitudinal}} } You will generally spend most of your time working with \code{ggobdata}s, you retrieve using \code{\link{$.GGobiData}}, \code{\link{[.GGobiData}}, or \code{\link{[[.GGobiData}}. Most of the time these will operate like normal R datasets while pointing to the data in GGobi so that all changes are kept in sync. If you need to force a ggobiDaataset to be an R \code{data.frame} use \code{\link{as.data.frame}}.} \examples{ggobi(ggobi_find_file("data", "flea.csv")) ggobi(ggobi_find_file("data", "flea.xml")) ggobi(mtcars) mtcarsg <- ggobi_get()$mtcars glyph_colour(mtcarsg) glyph_colour(mtcarsg) <- ifelse(mtcarsg$cyl < 4, 1, 2) glyph_size(mtcarsg) <- mtcarsg$cyl} \keyword{dynamic} rggobi/man/mapGlyphType-t9.rd0000644000175100001440000000044412325776642015640 0ustar hornikusers\name{mapGlyphType} \alias{mapGlyphType} \title{Map glyph type.} \author{Hadley Wickham } \description{ Map glyph character code to number } \usage{mapGlyphType(types)} \arguments{ \item{types}{vector of glyph character codes} } \keyword{dynamic} \keyword{internal} rggobi/man/display-ce.rd0000644000175100001440000000034512325776642014715 0ustar hornikusers\name{display} \alias{display} \title{Display construction} \author{Hadley Wickham } \description{ Create a new display } \usage{display(x, ...)} \arguments{ \item{x}{} \item{...}{} } \keyword{internal} rggobi/man/connecting-edges-vf.rd0000644000175100001440000000053412325776642016510 0ustar hornikusers\name{connecting_edges} \alias{connecting_edges} \title{Get connecting edges} \author{Hadley Wickham } \description{ Get actual edges from application of edges dataset to target dataset. } \usage{connecting_edges(x, y)} \arguments{ \item{x}{target ggobi dataset} \item{y}{ggobi dataset containing edges} } \keyword{manip} rggobi/man/set--GGobiData-56.rd0000644000175100001440000000134512325776642015543 0ustar hornikusers\name{"[<-.GGobiData"} \alias{[<-.GGobiData} \alias{$<-.GGobiData} \alias{[[<-.GGobiData} \title{Assignments for ggobi datasets} \author{Hadley Wickham } \description{ This functions allow one to treat a ggobi dataset as if it were a local data.frame. One can extract and assign elements within the dataset. } \usage{\S3method{[}{GGobiData}(x, i, j) <- value} \arguments{ \item{x}{ggobi dataset} \item{i}{row indices} \item{j}{column indices} \item{value}{new values} } \details{This method works by retrieving the entire dataset into R, subsetting that copy, and then returning any changes.} \examples{g <- ggobi(mtcars) x <- g["mtcars"] x[1:5, 1:5] x[1:5, 1] <- 1:5 x[1:5, 1:5]} \keyword{manip} \keyword{internal} rggobi/man/summary-GGobiData-mm.rd0000644000175100001440000000053112325776642016543 0ustar hornikusers\name{summary.GGobiData} \alias{summary.GGobiData} \title{Summarise GGobiData.} \author{Hadley Wickham } \description{ Summarise a GGobiData with dimensions, mode and variable names. } \usage{\S3method{summary}{GGobiData}(object, \dots)} \arguments{ \item{object}{GGobiData} \item{\dots}{ignored} } \keyword{attribute} rggobi/man/dataset-numeric-gd.rd0000644000175100001440000000142512325776642016340 0ustar hornikusers\name{dataset.numeric} \alias{dataset.numeric} \alias{dataset.character} \title{Get ggobi dataset.} \author{Hadley Wickham } \description{ Get an object representing an internal ggobi dataset } \usage{\S3method{dataset}{numeric}(x, .gobi = ggobi_get())} \arguments{ \item{x}{which dataset to retrieve, an integer for positional matching or a character to match by name} \item{.gobi}{GGobi instance} } \value{A list of \code{GGobiData} objects} \details{It is convenient to be able to refer to and operate on a ggobi dataset as if it were a regular R dataset. This function allows one to get an \code{GGobiData} object that represents a particular dataset.} \seealso{\code{\link{$.GGobiData}} for user level selection of datasets} \keyword{manip} \keyword{internal} rggobi/man/glyph-type-GGobiData-og.rd0000644000175100001440000000102312325776642017141 0ustar hornikusers\name{glyph_type.GGobiData} \alias{glyph_type.GGobiData} \alias{glyph_type} \title{Get glyph type.} \author{Hadley Wickham } \description{ Get glyph type. } \usage{\S3method{glyph_type}{GGobiData}(x)} \arguments{ \item{x}{GGobiData} } \details{Glyph type refers to the shape of the glyph, one of: \itemize{ \item a filled circle \item an empty circle \item a filled square \item an empty square \item a single pixel \item a plus sign \item a cross }} \seealso{\code{\link{glyph_type<-}}} \keyword{dynamic} rggobi/man/glyph-size---GGobiData-9w.rd0000644000175100001440000000063512325776642017226 0ustar hornikusers\name{"glyph_size<-.GGobiData"} \alias{glyph_size<-.GGobiData} \alias{glyph_size<-} \title{Set glyph size} \author{Hadley Wickham } \description{ Set glyph size } \usage{\S3method{glyph_size}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{vector of new sizes} } \details{Glyph size is an integer between 1 and 6.} \seealso{\code{\link{glyph_size}}} \keyword{dynamic} rggobi/man/names-GGobi-pt.rd0000644000175100001440000000042212325776642015370 0ustar hornikusers\name{names.GGobi} \alias{names.GGobi} \title{GGobi names} \author{Hadley Wickham } \description{ Get dataset names } \usage{\S3method{names}{GGobi}(x)} \arguments{ \item{x}{ggobi instance} } \examples{g <- ggobi(mtcars) names(g)} \keyword{dynamic} rggobi/man/dataset-GGobiDisplay-gk.rd0000644000175100001440000000076612325776642017231 0ustar hornikusers\name{dataset.GGobiDisplay} \alias{dataset.GGobiDisplay} \title{Get display dataset} \author{Hadley Wickham } \description{ Returns a link to the GGobiData (dataset) object associated with this display. } \usage{\S3method{dataset}{GGobiDisplay}(x, .gobi=ggobi(x))} \arguments{ \item{x}{GGobiDisplay object} \item{.gobi}{ggobi reference} } \details{See \code{\link{[.GGobi}} for more information on} \examples{g <- ggobi(mtcars) d <- displays(g)[[1]] dataset(d)} \keyword{manip} rggobi/man/ids---GGobiData-mw.rd0000644000175100001440000000050712325776642015774 0ustar hornikusers\name{"ids<-.GGobiData"} \alias{ids<-.GGobiData} \alias{ids<-} \title{Set row ids} \author{Hadley Wickham } \description{ Set row ids from a GGobiData } \usage{\S3method{ids}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{new values} } \seealso{\code{\link{ids}}} \keyword{manip} rggobi/man/ncol-GGobiData-p3.rd0000644000175100001440000000044512325776642015716 0ustar hornikusers\name{ncol.GGobiData} \alias{ncol.GGobiData} \title{GGobiData columns} \author{Hadley Wickham } \description{ Retrieve the number of columns in a GGobiData } \usage{\S3method{ncol}{GGobiData}(d)} \arguments{ \item{d}{dataset} } \keyword{attribute} \keyword{internal} rggobi/man/glyph-type---GGobiData-r1.rd0000644000175100001440000000055212325776642017216 0ustar hornikusers\name{"glyph_type<-.GGobiData"} \alias{glyph_type<-.GGobiData} \alias{glyph_type<-} \title{Set glyph type} \author{Hadley Wickham } \description{ Set glyph type } \usage{\S3method{glyph_type}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{vector of new types} } \seealso{\code{\link{glyph_type}}} \keyword{dynamic} rggobi/man/ggobi-GGobiDisplay-zh.rd0000644000175100001440000000052712325776642016706 0ustar hornikusers\name{ggobi.GGobiDisplay} \alias{ggobi.GGobiDisplay} \title{Get display GGobi} \author{Hadley Wickham } \description{ Returns a link to the GGobi object associated with this display } \usage{\S3method{ggobi}{GGobiDisplay}(data, \dots)} \arguments{ \item{data}{GGobiDisplay object} \item{\dots}{} } \keyword{internal} rggobi/man/print-GGobiDisplay-o0.rd0000644000175100001440000000052012325776642016641 0ustar hornikusers\name{print.GGobiDisplay} \alias{print.GGobiDisplay} \title{Print method for GGobiDisplay} \author{Hadley Wickham } \description{ Shows display type (first element in class vector) } \usage{\S3method{print}{GGobiDisplay}(x, \dots)} \arguments{ \item{x}{GGobiDisplay object} \item{\dots}{} } \keyword{internal} rggobi/man/clean-ggobi-bw.rd0000644000175100001440000000052012325776642015433 0ustar hornikusers\name{clean.ggobi} \alias{clean.ggobi} \title{Clean ggobi} \author{Hadley Wickham } \description{ Clean arguments for ggobi } \usage{clean.ggobi(x)} \arguments{ \item{x}{vector} } \details{Arguments for ggobi need to be in specific format. This function helps ensure that.} \keyword{dynamic} \keyword{internal} rggobi/man/print-GGobi-yo.rd0000644000175100001440000000052112325776642015425 0ustar hornikusers\name{print.GGobi} \alias{print.GGobi} \title{Print ggobi} \author{Hadley Wickham } \description{ Prints summary of ggobi object by instance } \usage{\S3method{print}{GGobi}(x, \dots)} \arguments{ \item{x}{ggobi object} \item{\dots}{} } \seealso{\code{\link{summary.GGobi}}} \keyword{dynamic} \keyword{internal} rggobi/man/close-GGobiDisplay-ke.rd0000644000175100001440000000066712325776642016707 0ustar hornikusers\name{close.GGobiDisplay} \alias{close.GGobiDisplay} \title{Close display} \author{Hadley Wickham } \description{ Closes the referenced display. The R variable will be invalid after this call. } \usage{\S3method{close}{GGobiDisplay}(con, \dots)} \arguments{ \item{con}{GGobiDisplay object to close} \item{\dots}{} } \examples{g <- ggobi(mtcars) displays(g) close(displays(g)[[1]]) displays(g)} \keyword{internal} rggobi/man/displays-GGobi-n2.rd0000644000175100001440000000146712325776642016023 0ustar hornikusers\name{displays.GGobi} \alias{displays.GGobi} \alias{displays.GGobi} \title{Get GGobi displays} \author{Hadley Wickham } \description{ Gets list of displays in the specified GGobi instance } \usage{\S3method{displays}{GGobi}(x)} \arguments{ \item{x}{GGobi object} } \details{A display basically corresponds to a window in GGobi. A display may contain mutliple plots within it. For example, the scatterplot matrix contains $p * p$ plots. Use this function to obtain a reference to a display (they are numbered in the order they are created) so you can change display mode, set variables (\code{\link{variables<-.GGobiDisplay}}), or save a static image to disk.} \seealso{\code{\link{display}} to create displays} \examples{g <- ggobi(mtcars) displays(g) display(g[1]) displays(g)} \keyword{dynamic} rggobi/man/dataset-mn.rd0000644000175100001440000000040212325776642014712 0ustar hornikusers\name{dataset} \alias{dataset} \title{Generic method for getting dataset} \author{Hadley Wickham } \description{ @keyword internal } \usage{dataset(x, .gobi = ggobi_get())} \arguments{ \item{x}{} \item{.gobi}{} } \keyword{internal} rggobi/man/get--GGobiData-9v.rd0000644000175100001440000000130612325776642015630 0ustar hornikusers\name{"[.GGobiData"} \alias{[.GGobiData} \alias{[[.GGobiData} \alias{$.GGobiData} \title{Subsettting} \author{Hadley Wickham } \description{ Subsetting for ggobi datasets } \usage{\S3method{[}{GGobiData}(x, i, j, drop=FALSE)} \arguments{ \item{x}{ggobi dataset} \item{i}{rows} \item{j}{cols} \item{drop}{drop dimensions?} } \value{desired subset from data.frame} \details{This functions allow one to treat a ggobi dataset as if it were a local data.frame. One can extract and assign elements within the dataset. This method works by retrieving the entire dataset into R, and then subsetting with R.} \examples{g <- ggobi(mtcars) x <- g$mtcars x[1:5, 1:5] x[[1]] x$cyl} \keyword{manip} rggobi/man/shadowed---GGobiData-h7.rd0000644000175100001440000000076012325776642016707 0ustar hornikusers\name{"shadowed<-.GGobiData"} \alias{shadowed<-.GGobiData} \alias{shadowed<-} \title{Set shadowed status} \author{Hadley Wickham } \description{ Set the exclusion status of points. } \usage{\S3method{shadowed}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{logical vector} } \details{If a point is shadowed it is drawn in a dark gray colour, behind all non-shadowed points. It cannot be selected.} \seealso{\code{\link{shadowed}}} \keyword{dynamic} rggobi/man/edges-lk.rd0000644000175100001440000000035512325776642014357 0ustar hornikusers\name{edges} \alias{edges} \title{Get edges} \author{Hadley Wickham } \description{ Get edges for a dataset } \usage{edges(x)} \arguments{ \item{x}{ggobi dataset} } \value{A matrix of edge pairs} \keyword{manip} rggobi/man/dimnames-GGobiData-x0.rd0000644000175100001440000000046312325776642016565 0ustar hornikusers\name{dimnames.GGobiData} \alias{dimnames.GGobiData} \title{Get dimension names} \author{Hadley Wickham } \description{ Get row and column names for a GGobiData } \usage{\S3method{dimnames}{GGobiData}(x)} \arguments{ \item{x}{ggobiDataget} } \keyword{attribute} \keyword{internal} rggobi/man/edges---GGobiDisplay-1y.rd0000644000175100001440000000062612325776642016750 0ustar hornikusers\name{"edges<-.GGobiDisplay"} \alias{edges<-.GGobiDisplay} \title{Set edges} \author{Hadley Wickham } \description{ Set edges for a display } \usage{\S3method{edges}{GGobiDisplay}(x) <- value} \arguments{ \item{x}{GGobiDisplay object} \item{value}{GGobiData object that contains edges} } \details{This sets the dataset that a GGobiDisplay uses to display edges.} \keyword{dynamic} rggobi/man/GGobiData-class.rd0000644000175100001440000000024112325776642015542 0ustar hornikusers\name{GGobiData-class} \title{GGobiData S4 class} \alias{GGobiData-class} \keyword{internal} \description{ This is an S4 version of the GGobiData S3 class. } rggobi/man/ggobi-pcp-c7.rd0000644000175100001440000000054512325776642015043 0ustar hornikusers\name{ggobi_pcp} \alias{ggobi_pcp} \title{Create parallel coordinates plot.} \author{Hadley Wickham } \description{ Mock up a pcp plot using points and edges. } \usage{ggobi_pcp(data, type="range")} \arguments{ \item{data}{} \item{type}{} } \details{Experimental and may suggest ways to reduce PCP code in GGobi} \keyword{internal} rggobi/man/rownames---GGobiData-rg.rd0000644000175100001440000000065612325776642017042 0ustar hornikusers\name{"rownames<-.GGobiData"} \alias{rownames<-.GGobiData} \title{Set row names} \author{Hadley Wickham } \description{ Set row names for a GGobiData } \usage{\S3method{rownames}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{new names} } \examples{g <- ggobi(mtcars) df <- g[1] rownames(df) rownames(df) <- tolower(rownames(df)) rownames(df)} \keyword{attribute} \keyword{internal} rggobi/man/colorscheme-6n.rd0000644000175100001440000000045012325776642015504 0ustar hornikusers\name{colorscheme} \alias{colorscheme} \title{Get active colour scheme} \author{Hadley Wickham } \description{ Get name of the active colour scheme } \usage{colorscheme(x)} \arguments{ \item{x}{GGobi object} } \examples{g <- ggobi(mtcars) colorscheme(g)} \keyword{color} rggobi/man/variables-2n.rd0000644000175100001440000000034112325776642015144 0ustar hornikusers\name{variables} \alias{variables} \title{Get variables} \author{Hadley Wickham } \description{ Get variable names from a container } \usage{variables(x)} \arguments{ \item{x}{} } \keyword{internal} rggobi/man/edges---GGobiData-qe.rd0000644000175100001440000000236012325776642016265 0ustar hornikusers\name{"edges<-.GGobiData"} \alias{edges<-.GGobiData} \title{Set edges} \author{Hadley Wickham } \description{ Set edges for a dataset. } \usage{\S3method{edges}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{matrix, data frame, or graph containing of edges. First column should be from edge, second column to edge.} } \details{In GGobi, and edge dataset is a special type of dataset that has two additional (hidden) columns which specification source and destination row names. These rownames are compared to the row names of the dataset in the current plot, and if any match, it is possible to specify this dataset as an edge set to the plotted datset. When this is done, edges will be drawn between points specified by the edge dataset. To remove edges, set edges to NULL.} \seealso{\code{\link{ggobi_longitudinal}} for creating edges which simulate time series plots} \examples{cc<-cor(t(swiss),use="p", method="s") ccd<-sqrt(2*(1-cc)) a <- which(lower.tri(ccd), arr.ind=TRUE) src <- row.names(swiss)[a[,2]] dest <- row.names(swiss)[a[,1]] weight <- as.vector(as.dist(ccd)) gg <- ggobi(swiss) gg$cor <- data.frame(weight) edges(gg$cor) <- cbind(src, dest) edges(gg$cor) edges(gg$cor) <- NULL} \keyword{manip} rggobi/man/ggobi-display-save-picture-bw.rd0000644000175100001440000000157512761400736020426 0ustar hornikusers\name{ggobi_display_save_picture} \alias{ggobi_display_save_picture} \title{Save picture of plot (and window) to disk} \author{Hadley Wickham } \description{ This allows you to make a static copy of a GGobiDisplay. } \usage{ggobi_display_save_picture(display=displays(ggobi_get())[[1]], path="ggobi_display.png", filetype="png", plot.only = FALSE)} \arguments{ \item{display}{GGobiDisplay to save} \item{path}{path to save to} \item{filetype}{type of file to save} \item{plot.only}{if TRUE, save only plot, otherwise save surrounding GUI elements as well} } \details{If you want to make publicaiton quality graphics, you should probably use the DescribeDisplay plugin and package. This will recreate a GGobiDisplay in R, and so can produce high-quality vector (eg. pdf) output. See \url{http://www.ggobi.org/describe-display} for more information} \keyword{hplot} rggobi/man/edges--p8.rd0000644000175100001440000000037212325776642014354 0ustar hornikusers\name{"edges<-"} \alias{edges<-} \title{Set edges} \author{Hadley Wickham } \description{ Generic method, see methods for more details } \usage{"edges<-"(x, value)} \arguments{ \item{x}{} \item{value}{} } \keyword{internal} rggobi/man/as-data-frame-GGobiData-i6.rd0000644000175100001440000000057512325776642017365 0ustar hornikusers\name{"as.data.frame.GGobiData"} \alias{as.data.frame.GGobiData} \alias{as.matrix.GGobiData} \title{Conversion methods} \author{Hadley Wickham } \description{ Convert a GGobiData to a regular R data.frame or matrix } \usage{\S3method{as.data.frame}{GGobiData}(x, \dots)} \arguments{ \item{x}{GGobiData} \item{\dots}{} } \keyword{manip} \keyword{internal} rggobi/man/ggobi-count-u4.rd0000644000175100001440000000123112325776642015421 0ustar hornikusers\name{ggobi_count} \alias{ggobi_count} \title{Get number of GGobis} \author{Hadley Wickham } \description{ Retrieves the number of ggobi instances within this session } \usage{ggobi_count()} \details{One or more ggobi instances can be created within an R session so that one can simultaneously look at different datasets or have different views of the same dataset. This function returns the number of ggobis in existence. The different ggobi instances are maintained as C level structures. This function accesses a variable that stores how many are in existence when the function is invoked.} \examples{ggobi_count()} \keyword{dynamic} rggobi/man/dimnames---GGobiData-ds.rd0000644000175100001440000000050612325776642016774 0ustar hornikusers\name{"dimnames<-.GGobiData"} \alias{dimnames<-.GGobiData} \title{Set dim names} \author{Hadley Wickham } \description{ Set dim names for a GGobiData } \usage{\S3method{dimnames}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{new names} } \keyword{attribute} \keyword{internal} rggobi/man/dim-GGobiData-ok.rd0000644000175100001440000000050412325776642015617 0ustar hornikusers\name{dim.GGobiData} \alias{dim.GGobiData} \title{GGobiData dimensions} \author{Hadley Wickham } \description{ Retrieve the dimension of a GGobiData } \usage{\S3method{dim}{GGobiData}(x)} \arguments{ \item{x}{dataset} } \examples{g <- ggobi(mtcars) dim(g[1])} \keyword{attribute} \keyword{internal} rggobi/man/excluded-GGobiData-ic.rd0000644000175100001440000000055412325776642016632 0ustar hornikusers\name{excluded.GGobiData} \alias{excluded.GGobiData} \title{Get excluded status} \author{Hadley Wickham } \description{ Get the exclusion status of points. } \usage{\S3method{excluded}{GGobiData}(x)} \arguments{ \item{x}{ggobiDataget} } \details{If a point is excluded it is not drawn.} \seealso{\code{\link{excluded<-}}} \keyword{dynamic} rggobi/man/excluded-ec.rd0000644000175100001440000000040012325776642015035 0ustar hornikusers\name{excluded} \alias{excluded} \alias{excluded<-} \title{Get and set exclusion} \author{Hadley Wickham } \description{ Get and set the exclusion status of points } \usage{excluded(x)} \arguments{ \item{x}{} } \keyword{internal} rggobi/man/names-GGobiData-c0.rd0000644000175100001440000000046612325776642016051 0ustar hornikusers\name{names.GGobiData} \alias{names.GGobiData} \title{GGobiData column names} \author{Hadley Wickham } \description{ Get column names for a GGobiData } \usage{\S3method{names}{GGobiData}(x, \dots)} \arguments{ \item{x}{dataset} \item{\dots}{} } \keyword{attribute} \keyword{internal} rggobi/man/close-GGobi-kz.rd0000644000175100001440000000126512325776642015401 0ustar hornikusers\name{close.GGobi} \alias{close.GGobi} \title{Close GGobi instance} \author{Hadley Wickham } \description{ Terminates and discards a ggobi instance } \usage{\S3method{close}{GGobi}(con, \dots)} \arguments{ \item{con}{ggobi object to close} \item{\dots}{ignored and for compatability generic function.} } \details{This allows the caller to close a ggobi instance and discard the resources it uses. The function closes the display windows and variable panel window associated with this ggobi instance. It also resets the default ggobi instance to be the last one created.} \examples{g1 <- ggobi(mtcars) g2 <- ggobi(mtcars) close(g2) close(ggobi_get())} \keyword{dynamic} rggobi/man/ggobi-gtk-main-window-l6.rd0000644000175100001440000000057712325776642017312 0ustar hornikusers\name{ggobi_gtk_main_window} \alias{ggobi_gtk_main_window} \title{Gtk main window} \author{Hadley Wickham } \description{ Retrieve RGtk object for main window } \usage{ggobi_gtk_main_window(.gobi = ggobi_get())} \arguments{ \item{.gobi}{} } \details{Useful for embedding in other applications or for listening to their signals via RGtk2.} \keyword{internal} rggobi/man/glyph-colour---GGobiData-u7.rd0000644000175100001440000000062012325776642017545 0ustar hornikusers\name{"glyph_colour<-.GGobiData"} \alias{glyph_colour<-.GGobiData} \alias{glyph_colour<-} \alias{glyph_color<-} \title{Set glyph colour} \author{Hadley Wickham } \description{ Set glyph colour } \usage{\S3method{glyph_colour}{GGobiData}(x) <- value} \arguments{ \item{x}{GGobiData} \item{value}{vector of new colours} } \seealso{\code{\link{glyph_colour}}} \keyword{dynamic} rggobi/man/ggobi-check-structs-qq.rd0000644000175100001440000000224312325776642017150 0ustar hornikusers\name{ggobi_check_structs} \alias{ggobi_check_structs} \title{Check structs} \author{Hadley Wickham } \description{ Validates GGobi and Rggobi views of internal data structures } \usage{ggobi_check_structs()} \value{TRUE if the sizes in the two libraries are the same, otherwise a named logical vector indicating which structures are different} \details{This function is called when the Rggobi library is loaded and it verifies that the sizes of the different internal data structures for GGobi are the same for both the GGobi shared library/DLL and the Rggobi package. This is important as the two shared libraries are compiled separately and may have different compilation flags, etc. that make them incompatible. This function simply compares the sizes of the two views of the structures and raises a warning if they do not agree. Essentially, you should never notice this function. A warning implies that you need to re-install Rggobi against the version of GGobi you are using. @value TRUE if the sizes in the two libraries are the same, otherwise a named logical vector indicating which structures are different} \keyword{programming} \keyword{internal} rggobi/man/glyph-size-GGobiData-3t.rd0000644000175100001440000000055412325776642017063 0ustar hornikusers\name{glyph_size.GGobiData} \alias{glyph_size.GGobiData} \alias{glyph_size} \title{Get glyph size} \author{Hadley Wickham } \description{ Get glyph size } \usage{\S3method{glyph_size}{GGobiData}(x)} \arguments{ \item{x}{GGobiData} } \details{Glyph size is an integer between 1 and 6.} \seealso{\code{\link{glyph_size<-}}} \keyword{dynamic} rggobi/man/edges---GGobi-m7.rd0000644000175100001440000000054112325776642015410 0ustar hornikusers\name{"edges<-.GGobi"} \alias{edges<-.GGobi} \title{Set edges} \author{Hadley Wickham } \description{ Create a new edges dataset and add to GGobi } \usage{\S3method{edges}{GGobi}(x) <- value} \arguments{ \item{x}{GGobi dataset} \item{value}{new edges} } \details{@arguments GGobi dataset @arguments new edges} \keyword{dynamic} rggobi/man/pmodes-tc.rd0000644000175100001440000000117612325776642014561 0ustar hornikusers\name{pmodes} \alias{pmodes} \alias{imodes} \alias{pmodes.default} \alias{pmodes.GGobiDisplay} \alias{imodes.GGobiDisplay} \alias{pmodes.character} \alias{imodes.character} \title{List available projection/interaction modes} \author{Hadley Wickham } \description{ These generic methods retrieves possible projection/interaction modes. } \usage{pmodes(x=NULL)} \arguments{ \item{x}{} } \details{The default methods retrieve a list modes for all display types, the character methods retrieve modes for a given display type, and the GGobiDisplay methods return possible modes for a given display} \keyword{internal} rggobi/man/ggobi-set-data-file-be.rd0000644000175100001440000000064312325776642016754 0ustar hornikusers\name{ggobi_set_data_file} \alias{ggobi_set_data_file} \title{Set data file.} \author{Hadley Wickham } \description{ Open data file and add to ggobi datasets. } \usage{ggobi_set_data_file(file, mode = "unknown", add = TRUE, .gobi = ggobi_get())} \arguments{ \item{file}{path to file} \item{mode}{mode of file} \item{add}{add?} \item{.gobi}{ggobi instance} } \keyword{manip} \keyword{internal} rggobi/man/ids-GGobiData-yu.rd0000644000175100001440000000043712325776642015656 0ustar hornikusers\name{ids.GGobiData} \alias{ids.GGobiData} \alias{ids} \title{Row ids} \author{Hadley Wickham } \description{ Retrive row ids from a GGobiData } \usage{\S3method{ids}{GGobiData}(x)} \arguments{ \item{x}{GGobiData} } \seealso{\code{\link{ids<-}}} \keyword{manip} rggobi/man/colorscheme--b2.rd0000644000175100001440000000106212325776642015541 0ustar hornikusers\name{"colorscheme<-"} \alias{colorscheme<-} \title{Set active colour scheme.} \author{Hadley Wickham } \description{ Specify the active color scheme in a GGobi instance or the session options. } \usage{"colorscheme<-"(x, value)} \arguments{ \item{x}{GGobi object} \item{value}{colour scheme to make active} } \value{The name of the previously active color scheme.} \details{This makes a particular color scheme active within a GGobi instance.} \examples{g <- ggobi(mtcars) colorscheme(g) <- "Set1 8" colorscheme(g) <- 1} \keyword{color} rggobi/man/print-GGobiData-ja.rd0000644000175100001440000000062412325776642016166 0ustar hornikusers\name{print.GGobiData} \alias{print.GGobiData} \title{Print GGobiData} \author{Hadley Wickham } \description{ Print GGobiData } \usage{\S3method{print}{GGobiData}(x, \dots)} \arguments{ \item{x}{GGobi dataset to retrieve} \item{\dots}{} } \details{By default printing a GGobiData acts like printing an R data.frame - ie. show all the data} \keyword{attribute} \keyword{internal} rggobi/man/ggobi-display-set-tour-projection-2n.rd0000644000175100001440000000163712325776642021671 0ustar hornikusers\name{ggobi_display_set_tour_projection} \alias{ggobi_display_set_tour_projection} \title{Set tour projection} \author{Hadley Wickham } \description{ Set the tour projection from a GGobi tour. } \usage{ggobi_display_set_tour_projection(gd, value)} \arguments{ \item{gd}{GGobiDisplay object running tour} \item{value}{tour projection} } \details{If you know the projection you would like to see in the tour, you can use this function to set it. The example illustrates setting the projection to show the first two principle components.} \examples{g <- ggobi(mtcars) d <- displays(g)[[1]] \dontrun{ pmode(d) <- "2D Tour" variables(d) <- list(X=names(mtcars)) ggobi_display_get_tour_projection(d) pc <- princomp(as.matrix(mtcars))$loadings[,1:2] ggobi_display_set_tour_projection(d, pc) pc <- princomp(as.matrix(mtcars), cor=T)$loadings ggobi_display_set_tour_projection(d, pc)[,1:2] }} \keyword{dynamic} rggobi/man/ggobi-version-ao.rd0000644000175100001440000000116412325776642016032 0ustar hornikusers\name{ggobi_version} \alias{ggobi_version} \title{Get version} \author{Hadley Wickham } \description{ GGobi version information } \usage{ggobi_version()} \value{ \item{date}{the release date of the ggobi library} \item{version}{a vector of 3 integers containing the major, minor and patch-level numbers.} \item{versionstring}{a string version of the major, minor and patch-level numbers,} } \details{Return an object that describes the version of the ggobi library being used. This allows code to execute conditionally on certain version numbers, etc.} \examples{ggobi_version()} \keyword{dynamic} rggobi/man/valid-ggobi-uv.rd0000644000175100001440000000172512325776642015502 0ustar hornikusers\name{valid_ggobi} \alias{valid_ggobi} \title{Validity checking} \author{Hadley Wickham } \description{ Determines whether a reference to an internal ggobi object is valid } \usage{valid_ggobi(.gobi)} \arguments{ \item{.gobi}{an object of class \code{ggobi} which refers to an internal ggobi instance.} } \value{\code{TRUE} if real object still exist, \code{FALSE} otherwise} \details{One can create multiple, independent ggobi instances within a single R session and one can also remove them either programmatically or via the GUI. To be able to refer to these objects which are actually C-level internal objects, one has a reference or handle from an S object. Since the C level object can be destroyed while the S object still refers to them, this function allows one to check whether the internal object to which R refers is still in existence.} \examples{g <- ggobi(mtcars) valid_ggobi(g) close(g) valid_ggobi(g) } \keyword{dynamic} \keyword{internal} rggobi/man/length-GGobiDisplay-gt.rd0000644000175100001440000000055112325776642017066 0ustar hornikusers\name{length.GGobiDisplay} \alias{length.GGobiDisplay} \title{Length method for GGobiDisplay} \author{Hadley Wickham } \description{ Returns the number of plots within a given display } \usage{\S3method{length}{GGobiDisplay}(x)} \arguments{ \item{x}{GGobiDisplay object from which to retrieve the number of plots} } \keyword{internal} rggobi/man/variables-GGobiDisplay-si.rd0000644000175100001440000000144112325776642017555 0ustar hornikusers\name{variables.GGobiDisplay} \alias{variables.GGobiDisplay} \title{Get display variables} \author{Hadley Wickham } \description{ List the variables used in a given display } \usage{\S3method{variables}{GGobiDisplay}(x)} \arguments{ \item{x}{GGobiDisplay object} } \details{There are three types of variables in GGobi displays: X, Y, Z, which correspond to the labels on the toggle buttons in GGobi. Most plots have a constrained set of possible options. For example, in tours you can only set X variables, and you must have at least three. Or in the rotation plot, you need exactly one X, Y, and Z variable. You can figure out what these conditions are by using the toggle buttons in GGobi.} \seealso{\code{\link{variables<-.GGobiDisplay}} for examples} \keyword{dynamic} rggobi/man/selected-GGobiData-xv.rd0000644000175100001440000000053712325776642016670 0ustar hornikusers\name{selected.GGobiData} \alias{selected.GGobiData} \alias{selected} \title{Get selection status} \author{Hadley Wickham } \description{ Returns logical vector indicating if each point is under the brush } \usage{\S3method{selected}{GGobiData}(x)} \arguments{ \item{x}{GGobiData} \item{}{logical vector} } \keyword{dynamic} rggobi/man/shadowed-GGobiData-8b.rd0000644000175100001440000000070712325776642016551 0ustar hornikusers\name{shadowed.GGobiData} \alias{shadowed.GGobiData} \alias{shadowed} \title{Get shadowed status} \author{Hadley Wickham } \description{ Get the exclusion status of points. } \usage{\S3method{shadowed}{GGobiData}(x)} \arguments{ \item{x}{ggobiDataget} } \details{If a point is shadowed it is drawn in a dark gray colour, behind all non-shadowed points. It cannot be selected.} \seealso{\code{\link{shadowed<-}}} \keyword{dynamic} rggobi/configure.win0000644000175100001440000000000012325763563014243 0ustar hornikusersrggobi/cleanup0000755000175100001440000000003512326000321013101 0ustar hornikusers#!/bin/sh rm -f src/Makevarsrggobi/LICENSE0000644000175100001440000000020612761404453012552 0ustar hornikusersYEAR: 2006-2016 COPYRIGHT HOLDER: Duncan Temple Lang, Deborah Swayne, Michael Lawrence, Hadley Wickham ORGANIZATION: GGobi foundation