[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