[ESS] S+ re-factoring ( some recent bugs/annoyances)

Martin Maechler maechler at stat.math.ethz.ch
Mon Dec 17 18:34:33 CET 2012


>>>>> Vitalie Spinu <spinuvit at gmail.com>
>>>>>     on Mon, 17 Dec 2012 16:25:56 +0100 writes:

    >>> gerald.jean at dgag.ca on Mon, 17 Dec 2012 10:13:11 -0500
    >>> wrote:

    >> Hello Vitalie,

    >> your function now works. Noticed though that I had to
    >> replace all "_" by ".", the "_" is not allowed in Splus
    >> it is still reserved, although obsolete, for assignement.
    >> Here is the output of the function for three functions,
    >> the last one being an home function.

    > Perfect! Merging into the trunk then.

    > Thank you very much.

    >     Vitalie

and to you, Vitalie!

That's really good, we got here!
(and indeed,  S+ now seems to have a  sprintf() function: good...)

Martin


    >>> funnargs(colMeans)
    >> (list "S+" '(("x" . "") ("..." . "")) )

    >>> funnargs(glm)
    >> (list "S+" '(("formula" . "formula(data)") ("family"
    >> . "gaussian") ("data" . "sys.parent()") ("weights" . "")
    >> ("subset" . "") ("na.action" . "") ("start" . "eta")
    >> ("control" . "glm.control(...)") ("method" .
    >> "\"glm.fit\"") ("model" . "F") ("x" . "F") ("y" . "T")
    >> ("contrasts" .  "NULL") ("..." . "")) )

    >>> funnargs(frequence)
    >> (list "S+" '(("object" . "") ("maxsum" . "100")
    >> ("sorting" . "F") ("weights" . "NULL")) )

    >> Thanks,

    >> Gérald

    >> (Embedded image moved to file: pic14887.gif)

    >> Gerald Jean, M. Sc. en statistiques Conseiller senior en
    >> statistiques Lévis (siège social)

    >> Actuariat corporatif, 418 835-4900, poste Modélisation et
    >> Recherche 7639 Assurance de dommages 1 877 835-4900,
    >> poste Mouvement Desjardins 7639 Télécopieur : 418
    >> 835-6657

    >> Faites bonne impression et imprimez seulement au besoin!

    >> Ce courriel est confidentiel, peut être protégé par le
    >> secret professionnel et est adressé exclusivement au
    >> destinataire. Il est strictement interdit à toute autre
    >> personne de diffuser, distribuer ou reproduire ce
    >> message. Si vous l'avez reçu par erreur, veuillez
    >> immédiatement le détruire et aviser l'expéditeur.  Merci.

    >> Vitalie Spinu <spinuvit at gmail.com> a écrit sur 2012/12/16
    >> 08:27:48 :

    >>> 
    >>> Hi again,
    >>> 
    >>> Here is a simpler version:
    >>> 
    >>> 
    >>> funnargs <- function(object){ funname <-
    >>> deparse(substitute(object)) fun <- try(object, silent =
    >>> TRUE) ## works for special objects also
    >>> if(is.function(fun)) { special <- grepl('[:$@[]',
    >>> funname) args <- args(fun) fmls <- formals(args)
    >>> fmls_names <- names(fmls) fmls <- gsub('\"', '\\\"',
    >>> as.character(fmls), fixed=TRUE) args_alist <-
    >>> sprintf("'(%s)", paste("(\"", fmls_names, "\" . \"",
    >>> fmls, "\")", sep = '', collapse = ' ')) envname <- if
    >>> (special) "" else "S+" cat(sprintf('(list \"%s\" %s
    >>> )\n', envname, args_alist)) } }
    >>> 
    >>> This is what it should return:
    >>> 
    R> tl <- list(pl = plot) funnargs(tl$pl)
    >>> (list "" '(("x" . "") ("y" . "") ("..." . "")) )
    >>> 
    >>> 
    >>> I have a bunch of comits waiting for someone to confirm
    >>> that the above works in S+.
    >>> 
    >>> Thanks, Vitalie
    >>> 
    >>> 
    >>> >> Vitalie Spinu <spinuvit at gmail.com> >> on Thu, 13 Dec
    >>> 2012 14:45:28 +0100 wrote:
    >>> 
    >>> >> the following functions are unknown to S+:
    >>> 
    >>> >> tryCatch, environmentName, environment
    >>> 
    >>> > So are there packages, directories? Functions are
    >>> store somewhere.
    >>> 
    >>> > I just need a function that takes an OBJECT and if
    >>> that OBJECT is a > function, print a string of the form
    >>> '(list "funPackage" '(("a" .
    >> "4")
    >>> > ("b" . "5")) )' where funPackage is the location of
    >>> the function. The > second sub-list is an elisp alist
    >>> with keys -- the function
    >> arguments,
    >>> > and the values -- the default values. If that OBJECT
    >>> is not a
    >> function
    >>> > return NULL.
    >>> 
    >>> > It should not be difficult, just to replace tryCatch,
    >> environmentName
    >>> > and environment with the counterparts in S+ in the
    >>> code I provided.
    >> Here
    >>> > it is again:
    >>> 
    >>> > funnargs <- > function(object){ > funname <-
    >>> as.character(substitute(object)) > fun <-
    >>> tryCatch(object, error=function(e) NULL) ## works for
    >>> special objects also > if(is.function(fun)) { > args <-
    >>> args(fun) > fmls <- formals(args) > fmls_names <-
    >>> names(fmls) > fmls <- gsub('\"', '\\\"',
    >>> as.character(fmls), fixed=TRUE) > args_alist <-
    >>> sprintf("'(%s)", paste("(\"", fmls_names, "\" . \"",
    >>> fmls, "\")", sep = '', collapse = ' ')) > envname <-
    >>> environmentName(environment(fun)) > cat(sprintf('(list
    >>> \"%s\" %s )\n', envname, args_alist)) > } > }
    >>> 
    >>> > Can you please investigate?
    >>> 
    >>> >> I am going to try to install the SVN version of S+
    >>> but I have no >> administrative rights on the machie
    >>> where I am running Splus, will it work >> anyway???
    >>> 
    >>> > Yes it will work in any directory you have write
    >>> permissions. It is > "make" not "make install" that you
    >>> have to run. You don't need > administrative rights for
    >>> that.
    >>> 
    >>> > Vitalie
    >>> 
    >>> >> (Embedded image moved to file:

    >>> >> pic19718.gif)

    >>> 
    >>> >> Gerald Jean, M. Sc. en statistiques

    >>> >> Conseiller senior en statistiques Lévis (siège
    >>> social)

    >>> 
    >>> >> Actuariat corporatif, 418 835-4900, poste

    >>> >> Modélisation et Recherche 7639

    >>> >> Assurance de dommages 1 877 835-4900, poste

    >>> >> Mouvement Desjardins 7639

    >>> >> Télécopieur : 418 >> 835-6657
    >>> 
    >>> >> Faites bonne impression et imprimez seulement au
    >>> besoin!

    >>> 
    >>> >> Ce courriel est confidentiel, peut être protégé par
    >>> le secret professionnel et >> est adressé exclusivement
    >>> au destinataire. Il est strictement interdit à toute >>
    >>> autre personne de diffuser, distribuer ou reproduire ce
    >>> message. Si vous l'avez >> reçu par erreur, veuillez
    >>> immédiatement le détruire et aviser l'expéditeur.  >>
    >>> Merci.

    >>> 
    >>> >> Vitalie Spinu <spinuvit at gmail.com> a écrit sur
    >>> 2012/12/12 11:22:45 :
    >>> 
    >>> >> >> gerald.jean at dgag.ca >> >> on Wed, 12 Dec 2012
    >>> 10:28:58 -0500 wrote:
    >>> >>
    >>> >> [...]
    >>> >>
    >>> >>
    gj> I am willing to test this release from SVN but have
    gj> never installed anything from SVN, where do I find how
    gj> to do it???
    >>> >>
    >>> >> It's very easy. The somewhat obfuscated instructions
    >>> are >>
    >>> http://ess.r-project.org/Manual/ess.html#Installation>>
    >>> >> Just do
    >>> >>
    >>> >> svn checkout https://svn.r-project.org/ESS/trunk ESS
    >>> >>
    >>> >> this creates ESS directory with the source
    >>> inside. Switch to it and
    >> do
    >>> >>
    >>> >> make
    >>> >>
    >>> >> This step is not strictly necessary but it makes
    >>> things faster.
    >>> >>
    >>> >> Now add to your init file:
    >>> >>
    >>> >> (load "~/path/to/ESS/lisp/ess-site")
    >>> >>
    >>> >> That's all.
    >>> >>
    >>> >> [...]
    >>> >>
    >>> >>
    >>> >> >> > args("plot") >> >> function (x, y, ...)  >> >>
    >>> NULL
    >>> >> >> >
    >>> >>
    >>> >> Good, now check if this function works:
    >>> >>
    >>> >> funnargs <- >> function(object){ >> funname <-
    >>> as.character(substitute(object)) >> fun <-
    >>> tryCatch(object, error=function(e) NULL) ## works for >>
    >>> special objects also >> if(is.function(fun)) { >> args
    >>> <- args(fun) >> fmls <- formals(args) >> fmls_names <-
    >>> names(fmls) >> fmls <- gsub('\"', '\\\"',
    >>> as.character(fmls), fixed=TRUE) >> args_alist <-
    >>> sprintf("'(%s)", paste("(\"", fmls_names, "\" >> . \"",
    >>> fmls, "\")", sep = '', collapse = ' ')) >> envname <-
    >>> environmentName(environment(fun)) >> cat(sprintf('(list
    >>> \"%s\" %s )\n', envname, args_alist)) >> } >> }
    >>> >>
    >>> >> it should do something of this kind:
    >>> >>
    >>> >>
    >>> >> > funnargs(plot) >> (list "graphics" '(("x" . "")
    >>> ("y" . "") ("..." . "")) ) >> > funnargs(ls) >> (list
    >>> "base" '(("name" . "") ("pos" . "-1") ("envir" . "as.
    >>> >> environment(pos)") ("all.names" . "FALSE") ("pattern"
    >>> . "")) )
    >>> >>
    >>> >> If it works, then we are done. You will have your
    >>> eldoc in the
    >> evening.
    >>> >>
    >>> >> Let me know what it returns for local functions:
    >>> >>
    >>> >> > tt <- list(fun = function(a = 4, b = 5) a*b) >> >
    >>> funnargs(tt$fun) >> (list "R_GlobalEnv" '(("a" . "4")
    >>> ("b" . "5")) )
    >>> >>
    >>> >>
    >>> >> Vitalie
    >>> 

    > ______________________________________________
    > ESS-help at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/ess-help



More information about the ESS-help mailing list