[R-wiki] sourcing code from wiki

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jul 26 16:44:43 CEST 2006


On 7/26/06, Philippe Grosjean <phgrosjean at sciviews.org> wrote:
> Hello,
>
> There is a series of functions to manipulate, search, edit R Wiki pages
> from within R that will be provided by the future 'rwiki' r package in

Great.

> development. Here is the function that does what you want in attachment.
> Best,
>
> Philippe Grosjean
>

Note there is a typo in the warning text in sourceWikiRcode.

Thanks.

> Gabor Grothendieck wrote:
> > This was just posted to r-help:
> >
> >    https://www.stat.math.ethz.ch/pipermail/r-help/2006-July/109931.html
> >
> > Now suppose we wanted to run the code on the wiki page referenced
> > in that post.  Currently I copy and paste the code from that wiki page into an R
> > session (or else into a file, save it and source it).  It would be
> > convenient if it were possible to source the code for each of the code snippets
> > on the referenced wiki page directly:
> >
> >    source("http://...whatever...")
> >
> > Is this already possible?
> > If so, how does one discover the url?
> >
> > If not,it would be nice to have some feature to facilitate grabbing code
> > from the wiki.
> >
> > _______________________________________________
> > R-sig-wiki mailing list
> > R-sig-wiki at r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-sig-wiki
> >
> >
>
>
> getWikiRcode <- function(wikipage, url = "http://wiki.r-project.org/rwiki",
>        strip.empty.lines = TRUE, strip.output = FALSE) {
>        # Read the raw wiki page
>        Url <- paste(url, "/doku.php?id=", wikipage, "&do=export_raw", sep ="")
>        Raw <- readLines(Url)
>
>        # Get only <code r> .... </code> chunks from this page
>        Codestart <- grep("^\\s*<code", Raw)
>        Codeend <- grep("^\\s*</code>", Raw)
>        # A little bit of checking first
>        if (length(Codestart) != length(Codeend) || any(Codeend <= Codestart))
>                stop("Malformed wiki page (wrong <code>... </code> sections)")
>        # Get only r code sections (those starting with <code r> from the list
>        Rstart <- grep("^\\s*<code r>", Raw)
>        if (length(Rstart) == 0) return(character(0))   # no R code in this page
>        isRsection <- Codestart %in% Rstart
>        Rend <- Codeend[isRsection]
>
>        # Construct the list of text lines related to r code
>        R <- data.frame(Start = Rstart, End = Rend)
>        Seq <- function(x) seq(from = x[1], to = x[2])
>        Rrows <- c(apply(R, 1, Seq), recursive = TRUE)
>        Rcode <- Raw[Rrows]
>
>        # Eliminate <code r> and </code> tags
>        Rcode <- gsub("^\\s*</?code( r)?>.*$", "", Rcode)
>
>        # Eliminate prompt from R code '> ', or '+ ' at the begining of a line
>        Rcode <- sub("^[>+] ", "", Rcode)
>
>        # Possibly eliminate empty lines
>        if (strip.empty.lines) Rcode <- Rcode[Rcode != ""]
>
>        # Possibly eliminate output (lines starting with '#!')
>        if (strip.output) {
>                Routput <- grep("^\\#\\!", Rcode)
>                if (length(Routput) > 0) Rcode <- Rcode[-Routput]
>        }
>
>        # Return the R code
>        return(Rcode)
> }
>
> rcode <- getWikiRcode("tips:data-frames:merge")
> rcode
>
> sourceWikiRcode <- function(wikipage, echo = TRUE, url = "http://wiki.r-project.org/rwiki",
>        strip.empty.lines = TRUE, strip.output = FALSE, ...) {
>        # Call getWikiRcode() to extract r code from wiki pages
>        Rcode <- getWikiRcode(wikipage = wikipage, url = url,
>                strip.empty.lines = strip.empty.lines, strip.output = strip.output)
>        if (length(Rcode) == 0) {
>                warning("No r ocde in this page!")
>        } else {
>                Con <- textConnection(Rcode)
>                source(Con, echo = echo, ...)
>                close(Con)
>        }
> }
>
> sourceWikiRcode("tips:data-frames:merge")
> # Here, the last part of this page is not directly executable (data1 is not defined)
> # but the rest is fine!
>
>



More information about the R-sig-wiki mailing list