Hi,

This post might get you started:
http://romainfrancois.blog.free.fr/index.php?post/2009/03/07/What-functions-are-called-by-my-function

> tail( callees( nls ), 20 )
functions
           names          new.env      nls.control         nlsModel
               8                1                2                2
nlsModel.plinear     nls_port_fit             nrow             NROW
               1                1                1                1
         numeric     parent.frame            paste            range
               1                2                7                1
             rep           sapply           sQuote             stop
               3                2                2                6
      substitute           switch         tryCatch          warning
               3                2                1                5

Note that it gives you the special and builtins as well, so this like "(", "[", "{" which you can filter out using something like this :

> funs <- callees( nls )
> funs[ grepl( "[.[:alpha:]]", names(funs) ) ]
functions
        all.vars              any     as.character       as.formula
               2                3                3                2
      as.integer          as.list          as.name           assign
               1                4                3                1
            attr                c            .Call            class
               6                1                1                1
            diff      environment             eval      eval.parent
               1                4                5                1

A bit more work would be required to filter out the ones you consider "trivial", maybe this can help :

> sapply( names(funs), find )
$`<`
[1] "package:base"

$`<-`
[1] "package:base"

...

Too bad find only works with one object at once ... I have this simplified version in package svTools :

# Similar to "find" but `what` can be a vector
# also, this one only searches in packages (position of the search path
# matching '^package:') and only gives one result per what
".find.multiple" <- function (what){
    stopifnot(is.character(what))
    sp <- grep( "^package:", search(), value = TRUE)
    out <- rep( "" , length(what))
    for (i in sp) {
        ok <- what %in% ls(i, all.names = TRUE) & out == ""
        out[ok] <- i
        if (all(out!="")) break
    }
    names(out) <- what
    sub("^package:", "", out)
}

> .find.multiple( names( funs ) )
               <               <-               ==                >
          "base"           "base"           "base"           "base"
               |               ||                -                :
          "base"           "base"           "base"           "base"
...

but this is probably not good enough since it ignores namespaces, lexical scoping, ...


Another way is to use the -- about to be released -- "parser" package (see highlight project on r-forge: http://r-forge.r-project.org/projects/highlight/)

> require( parser )
> data <- attr( parser( "/tmp/nls.txt" ), "data" )
> data[ data$token.desc == "SYMBOL_FUNCTION_CALL", "text" ]
  [1] "parent.frame"     "nls.control"      "c"
  [4] "as.formula"       "match.arg"        "is.list"
  [7] "is.environment"   "stop"             "match.call"
 [10] "all.vars"         "length"           "all.vars"
...

but again this is only based on the parser and does not care about namespaces or scoping

Anyway, hope this helps.

Romain


On 07/23/2009 08:28 AM, Andrej-Nikolai Spiess wrote:
Dear R-helpers,

does anyone know of some package/function that can build a network from
the functions that are implemented in a package,
i.e. visualize the cross-references from one function to another in the
same or some dependent package?
An example would be a function like 'nls' on top of the hierarchy and
then a network of nodes from the functions that are called within 'nls'
such as
'getInitial', 'nlsModel', 'nls_port_fit' etc. Important maybe also some
way to tweak such as not to include<  trivial>  functions such as
'as.formula'.

Many thanks in advance,
Andrej

_____________________________________
Dr. rer. nat. Andrej-Nikolai Spiess (Dipl. Biol.)
Department of Andrology
University Hospital Hamburg-Eppendorf
Martinistr. 52
20246 Hamburg
phone: +49-40-7410-51585
fax: +49-40-7410-51554
email: a.spi...@uke.de



--
Romain Francois
Independent R Consultant
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/tlNb : RGG#155, 156 and 157
|- http://tr.im/rw0p : useR! slides
`- http://tr.im/rw0b : RGG#154: demo of atomic functions

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to