[ESS] S+ re-factoring ( some recent bugs/annoyances)
Vitalie Spinu
spinuvit at gmail.com
Mon Dec 17 16:25:56 CET 2012
>> 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
>> 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)
R> 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 never installed
gj> anything from SVN, where do I find how 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
>>
More information about the ESS-help
mailing list