Comment acceder au code source d'une fonction R ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Comment acceder au code source d'une fonction R ?

Messagepar Thomas Galtier » 25 Mai 2007, 15:29

Bonsoir,

J'aimerai acceder au code source d'une fonction R du package gstat pour bien voir comment c'est fait ..

Problème : je sais pas afficher le code source :oops: :oops:

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 25 Mai 2007, 15:41

Il suffit parfois de taper le nom de la fonction:

Code : Tout sélectionner

> is.element
function (el, set)
match(el, set, 0) > 0
<environment: namespace:base>


La méthode de choix est de charger les sources du packages (avec extension .tar.gz), de les décompresser et de chercher le fichier contenant le code: permet d'avoir les commentaires écrits par le développeur: ces commentaires disparaissent à la "compilation" du package.

Dans certains cas (packages utilisant un NAMESPACE), seules certaines fonctions sont visibles pour l'utilisateur. L'opérateur ::: permet toutefois de les récupérer:

Code : Tout sélectionner

> AIC
function (object, ..., k = 2)
UseMethod("AIC")
<environment: namespace:stats>
> methods(AIC)
[1] AIC.default* AIC.logLik*

   Non-visible functions are asterisked
> AIC.logLik
Erreur : objet "AIC.logLik" non trouvé
> stats:::AIC.logLik
function (object, ..., k = 2)
-2 * c(object) + k * attr(object, "df")
<environment: namespace:stats>


Renaud

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 25 Mai 2007, 15:44

merci renaud.

peux-tu me donner un exemple pour la fonction "krige" du package "gstat" ?

:oops: :oops:

PS:je debute vraiment en R et le souci c que j'ai pas le temps de lire la base de la bse ... je prepare une "pré-thèse" et j'ai un délai tres court là ... avant j'etais sous matlab ...

Encore merci à toi

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 25 Mai 2007, 15:47

En fait dans les packages que j'ai en .zip ... ça retourne automatiquement à l'aide en ligne ...

Moi j'aimerai vraiment le code source de la fonction ...

Là j'y arrive pas ...

:cry:

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 25 Mai 2007, 15:53

Là avec le is.elementça marche pas ... et pareil avec le package pour krige dans package gstat.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 25 Mai 2007, 15:55

Première étape: regarder le sommaire du package: tu verras qu'il y a différentes fonctions qui se cachent sous krige. il faut alors savoir laquelle t'intéresse, et taper son nom à l'invite de commande dans la console R, en utilisant l'opérateur ":::":

Code : Tout sélectionner

> gstat:::krige.spatial
function (formula, locations, newdata, model = NULL, ..., beta = NULL,
    nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0),
    nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1)
{
    g = gstat(formula = formula, data = locations, model = model,
        beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist,
        ...)
    predict.gstat(g, newdata = newdata, block = block, nsim = nsim,
        indicators = indicators, na.action = na.action, debug.level = debug.level)
}
<environment: namespace:gstat>

Dans ce cas, il va falloir que tu continues tes recherches pour voir le code de gstat et de predict.gstat, sur le même principe. Elles ne sont pas cachées, il suffit de taper leur nom à l'invite de commande:

Code : Tout sélectionner

> predict.gstat
function (object, newdata, block = numeric(0), nsim = 0, indicators = FALSE,
    BLUE = FALSE, debug.level = 1, mask, na.action = na.pass,
    sps.args = list(n = 500, type = "regular", offset = c(0.5,
        0.5)), ...)
{
    if (missing(object) || length(object$data) < 1)
        stop("no data available")
    if (!inherits(object, "gstat"))
        stop("first argument should be of class gstat")
    if (!is.null(object$locations) && inherits(object$locations,
        "formula") && !(is(newdata, "Spatial"))) {
        coordinates(newdata) = object$locations
        return.sp = FALSE
    }
...


Bon courage !

Renaud

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 25 Mai 2007, 15:56

Merci à toi Renaud ... je te tiens au courant de mes investigations apres le week end.

Bon week end à toi :wink:

Thomas

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 27 Mai 2007, 10:13

Thomas Galtier a écrit :En fait dans les packages que j'ai en .zip ... ça retourne automatiquement à l'aide en ligne ...

Moi j'aimerai vraiment le code source de la fonction ...

Là j'y arrive pas ...

:cry:


Pour avoir le code source de la fonction avec les éventuels commentaires de l'auteur (souvent très utiles pour comprendre !), il faut télécharger les sources du packages, les décompacter et examiner le fichier contenant le code. Par exemple pour gstat, charger les sources à

http://cran.r-project.org/src/contrib/gstat_0.9-39.tar.gz

décompresser les sources avec votre logiciel préferré (WinZip, 7-zip,...) et chercher dans l'archive. Tu tombes rapidement (par exemple) sur le fichier krige.R qui comporte le code suivant:

Code : Tout sélectionner

# $Id: krige.q,v 1.14 2007-02-27 22:09:32 edzer Exp $

if (!isGeneric("krige"))
   setGeneric("krige", function(formula, locations, ...)
      standardGeneric("krige"))

"krige.locations" <-
function (formula, locations, data = sys.frame(sys.parent()),
   newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0,
   maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE,
   na.action = na.pass, debug.level = 1)
{
    g = gstat(formula = formula, locations = locations, data = data,
      model = model, beta = beta, nmax = nmax, nmin = nmin,
      maxdist = maxdist, ...)
    predict.gstat(g, newdata = newdata, block = block, nsim = nsim,
      indicators = indicators, na.action = na.action, debug.level = debug.level)
}
setMethod("krige", c("formula", "formula"), krige.locations)

krige.spatial <- function(formula, locations, newdata, model = NULL, ...,
   beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0),
   nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1)
{
   # locations = coordinates(arg2)
    g = gstat(formula = formula, # locations = locations,
      data = locations,
      model = model, beta = beta, nmax = nmax, nmin = nmin,
      maxdist = maxdist, ...)
    predict.gstat(g, newdata = newdata, block = block, nsim = nsim,
      indicators = indicators, na.action = na.action, debug.level = debug.level)
}
setMethod("krige", c("formula", "Spatial"), krige.spatial)
setMethod("krige", c("formula", "NULL"), krige.spatial)

if (!isGeneric("idw"))
   setGeneric("idw", function(formula, locations, ...)
      standardGeneric("idw"))

idw.locations <-
function (formula, locations, data = sys.frame(sys.parent()),
      newdata, nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0),
      na.action = na.pass, idp = 2.0) {
   krige(formula, locations, data, newdata, nmax = nmax, nmin = nmin,
      maxdist = maxdist, block = block, na.action = na.action,
      set = list(idp = idp))
}
setMethod("idw", c("formula", "formula"), idw.locations)

idw.spatial <-
function (formula, locations,
      newdata, nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0),
      na.action = na.pass, idp = 2.0) {
   krige(formula, locations, newdata, nmax = nmax, nmin = nmin,
      maxdist = maxdist, block = block, na.action = na.action,
      set = list(idp = idp), model = NULL)
}
setMethod("idw", c("formula", "Spatial"), idw.spatial)



Renaud

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 28 Mai 2007, 08:04

Merci Renaud ... j'avias bien la fonction ... mais en decompressant j'ai pas reussi à avoir le code que tu as eu toi ... MERCI MERCI car là j'vai pouvoir mieux saisir ce que la fonction fait ;)

Sinon, comment as tu fait car comme ça je peux le faire pour les autres fonctions ..j'ai le package gstat, les fonctions.R mais pour avoir le code pas reussi ...

Encore un grand merci à toi Renaud :D :D :D :D :D :D :D

Thomas

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 28 Mai 2007, 10:44

Sinon, comment as tu fait car comme ça je peux le faire pour les autres fonctions ..j'ai le package gstat, les fonctions.R mais pour avoir le code pas reussi ...


Bien lire mes réponses.

Renaud

Thomas Galtier
Messages : 93
Enregistré le : 14 Mai 2007, 12:08

Messagepar Thomas Galtier » 28 Mai 2007, 10:47

C'est bon ... c'etait vraiment pour lire et afficher lorsque l'on a le fichier krige.R

mais c'est bon ça a marché, tout à l'heure c'est juste que ça avait planté :lol:

Merci encore renaud :P


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité