Okay, here's the update.

I've created a new function create.post() (with Windows and Unix versions) which would be the internal function that creates the post template ready to edit and optionally send. In the Windows version I've added an experimental method == "mailto" option, which will open the post template in the default mailer (e.g. Outlook) ready to edit and post. Maybe a Unix version would also be nice, e.g.

browseURL("mailto:[EMAIL PROTECTED] bug&body=%0A<<insert bug report here>>%0A%0A%0A%0A--please do not edit the information below--%0A%0AVersion:%0A platform = x86_64-unknown-linux-gnu%0A ...")

would open the post template in e.g. Thunderbird, but has the side effect of opening an empty page in the web browser. I don't know if there's a neater solution?

The create.post() function is basically the old bug.report() with two extra arguments: 'description' (e.g. "bug report") and 'instructions' (e.g. "\\n<<Type your message here>>\\n") for customization. It could be used directly e.g to post to R-devel with session information.

The new bug.report() simply calls create.post() with the appropriate arguments.

The improved help-request() function calls create.post() after running through the checks described before.

In response to Gabor's comments, help.request():

- now checks packages are up-to-date and gives option to update on-the-fly (user may not know whether involved in query, so check all)

- keeps default mailing options as in old bug.report() but create.post() gives clearer message ("Email the post now?\n (yes/no)") requiring definite response ("yes" vs "y")

- still uses online documents because some are only available online (R Site Search, posting guide), it ensures the most up-to-date documentation is used, and it allows direction to global FAQ page, avoiding need to check whether user is on Windows/Mac

 - uses more robust method of checking R version is up-to-date

I've also written a help file for help.request() which includes the method="mailto" option. The help file for bug.report would need updating if this option was kept.

Best wishes,

Heather


Martin Maechler wrote:
 >>>>> "HT" == Heather Turner <[EMAIL PROTECTED]>
 >>>>>     on Mon, 09 Jun 2008 17:21:17 +0100 writes:

    HT> Thanks for the helpful tips and suggestions, I'll work
    HT> them in. You get local versions of the documents on Unix
    HT> too - RShowDoc() will do the trick.

    HT> I'll post an updated version in due course,

Thank you, Heather and Gabor (and the other contributors).
Indeed, I too like the idea of providing a new R function for
this.
Ideally, Heather, you'd try to "factor out" some of the common
functionality of bug.report() and help.request() into a few
utils-namespace hidden auxiliary functions.

Ideally, you'd attach text/plain attachments (base64 encoded) so
there won't be line wrap arounds.

Martin



    HT> Gabor Grothendieck wrote:
    >> That's an excellent idea.
    >>
    >> One other item that could be checkable would be if the
    >> user has the most recent versions of the packages
    >> involved in the query.  Perhaps it could display the
    >> unupdated packages and ask the user if any of those are
    >> involved in the query.
    >>
    >> Probably needs to give fair warning that it is sending
    >> off an email so people don't wind up sending out emails
    >> when they are really just trying out the system.
    >> Probably "none" should be the default for email so that
    >> its not regarded as obnoxious.
    >>
    >> Might be nice if it used local versions of documents if
    >> they exist locally.  On Windows they do.
    >>
    >> Check out ?getRversion
    >>
    >> On Mon, Jun 9, 2008 at 10:35 AM, Dr Heather Turner
    >> <[EMAIL PROTECTED]> wrote:
    >>> Whilst it is a good idea to improve the posting guide,
    >>> it seems to me that it would be useful to have a
    >>> function along the lines of bug.report(), to help a
    >>> potential questioner make sure they have done their
    >>> homework and have the relevant information to put into a
    >>> post to R-help.
    >>>
    >>> Even those of us who know what ought to go into a post
    >>> can sometimes forget to check something obvious - I
    >>> recently got caught out by not checking an error was
    >>> reproducible in the patched version for example.
    >>>
    >>> So I have written a help.request() function (see below),
    >>> which - prompts the user to check the relevant
    >>> resources, stopping and opening the relevant url where
    >>> necessary - checks their R version is up-to-date (in a
    >>> rather messy way - please suggest improvements!)  -
    >>> prompts them to prepare appropriate example code and
    >>> test it in a fresh R session - prompts them to give a
    >>> meaningful subject line - automatically adds system info
    >>> to the post (as in bug.report) - sends the message for
    >>> them (ensuring a fresh thread is started)
    >>>
    >>> Is this an idea worth taking further? I would be happy
    >>> to make improvements as suggested and write a help file
    >>> if so.
    >>>
    >>> Heather
    >>>
    >>> ------------------------------------------------------------
    >>>
    >>> help.request <- function (subject = "", ccaddress =
    >>> Sys.getenv("USER"), method = getOption("mailer"),
    >>> address = "[EMAIL PROTECTED]", file =
    >>> "R.help.request") { no <- function(answer) answer == "n"
    >>> yes <- function(answer) answer == "y" go <-
    >>> function(url) { cat("Please do this first - the site has
    >>> been loaded in your web browser\n") browseURL(url) }
    >>> cat("Checklist:\n") post <- readline("Have you read the
    >>> posting guide? (y/n) ") if (no(post))
    >>> return(go("http://www.r-project.org/posting-guide.html";))
    >>> FAQ <- readline("Have you checked the FAQ? (y/n) ") if
    >>> (no(FAQ))
    >>> return(go("http://cran.r-project.org/faqs.html";)) intro
    >>> <- readline("Have you checked An Introduction to R?
    >>> (y/n) ") if (no(intro))
    >>> return(go("http://cran.r-project.org/doc/manuals/R-intro.html";))
    >>> NEWS <- readline("Have you checked the NEWS of the
    >>> latest development release? (y/n) ") if (no(NEWS))
    >>> return(go("https://svn.r-project.org/R/trunk/NEWS";))
    >>> rsitesearch <- readline("Have you looked on RSiteSearch?
    >>> (y/n) ") if (no(rsitesearch)) { cat("Please do this
    >>> first - the site has been loaded in your web browser\n")
    >>> return(RSiteSearch(subject)) } inf <- sessionInfo() if
    >>> ("otherPkgs" %in% names(inf)){ other <- readline("You
    >>> have packages other than the base packages loaded.",
    >>> "\nIf your query relates to one of these, have you ",
    >>> "checked any corresponding books/manuals \nand ",
    >>> "considered contacting the package maintainer?  (y/n/NA)
    >>> ") if(no(other)) return("Please do this first.")  }
    >>>
    >>> man <- url("http://cran.r-project.org/manuals.html";) ver
    >>> <- scan(man, what = character(0), sep = "\n", skip = 13,
    >>> nlines = 1, quiet = TRUE) major <-
    >>> as.numeric(substr(ver, start = 18, stop = 18)) minor <-
    >>> as.numeric(substr(ver, start = 20, stop = 22)) if (major
    >>> < as.numeric(R.Version()$major) || minor <
    >>> as.numeric(R.Version()$major)) { update <-
    >>> readline("Your R version is out-of-date, would you like
    >>> to update now? (y/n) ") if (yes(update)) {
    >>> return(go(getOption("repos"))) } } ## To get long
    >>> prompt!  cat("Have you written example code that is\n",
    >>> "- minimal\n - reproducible\n - self-contained\n -
    >>> commented", "\nusing data that is either\n", "-
    >>> constructed by the code\n - loaded by data()\n", "-
    >>> reproduced using dump(\"mydata\", file = \"\")\n") code
    >>> <- readline(paste("have you checked this code in a fresh
    >>> R session", "\n(invoking R with the --vanilla option if
    >>> possible)", "\nand is this code copied to the clipboard?
    >>> (y/n) ")) if (no(code)) return(cat("\nIf your query is
    >>> not directly related to code", "(e.g. a general query
    >>> \nabout R's capabilities),", "email [EMAIL PROTECTED]
    >>> directly. ", "\nOtherwise prepare some example code
    >>> first.\n")) change <- readline(paste("Would you like to
    >>> change your subject line:\n", subject, "\nto something
    >>> more meaningful? (y/n) ")) if (yes(change)) subject <-
    >>> readline("Enter subject: \n")
    >>>
    >>> methods <- c("mailx", "gnudoit", "none", "ess") method
    >>> <- if (is.null(method)) "none" else
    >>> methods[pmatch(method, methods)] body <-
    >>> paste("\\n<<Write your query here, using your example
    >>> code to
    illustrate> ",
    >>> "\\n<<End with your name and affiliation>>\\n\\n\\n\\n",
    >>> "--please do not edit the information below--\\n\\n",
    >>> "Version:\\n ", paste(names(R.version), R.version, sep =
    >>> " = ", collapse = "\\n "), if
    >>> (nzchar(Sys.getenv("R_GUI_APP_VERSION")))
    >>> paste("\\n\\nGUI:\\n R-GUI ",
    >>> Sys.getenv("R_GUI_APP_VERSION"), " (",
    >>> Sys.getenv("R_GUI_APP_REVISION"), ")", sep = "") else
    >>> "", "\\n\\n", "Locale:\\n", Sys.getlocale(), "\\n\\n",
    >>> "Search Path:\\n ", paste(search(), collapse = ", "),
    >>> "\\n", sep = "", collapse = "") if (method == "gnudoit")
    >>> { cmd <- paste("gnudoit -q '", "(mail nil \"", address,
    >>> "\")", "(insert \"", body, "\")", "(search-backward
    >>> \"Subject:\")", "(end-of-line)'", sep = "") system(cmd)
    >>> } else if (method == "none") { disclaimer <- paste("#
    >>> Your mailer is set to \"none\" (default on Windows),\n",
    >>> "# hence we cannot send the help request directly from
    >>> R.\n", "# Please copy the help request (after finishing
    >>> it) to\n", "# your favorite email program and send it
    >>> to\n#\n", "# ", address, "\n#\n",
    >>> "######################################################\n",
    >>> "\n\n", sep = "") cat(disclaimer, file = file) body <-
    >>> gsub("\\\\n", "\n", body) cat(body, file = file, append
    >>> = TRUE) cat("Please edit the help request.\n")
    >>> system(paste(getOption("editor"), file)) cat("The unsent
    >>> help request can be found in file", file, "\n") } else
    >>> if (method == "mailx") { if (missing(subject))
    >>> stop("'subject' missing") body <- gsub("\\\\n", "\n",
    >>> body) cat(body, file = file, append = FALSE) cat("Please
    >>> edit the help request.\n")
    >>> system(paste(getOption("editor"), file)) if
    >>> (is.character(ccaddress) && nzchar(ccaddress)) { cmdargs
    >>> <- paste("-s '", subject, "' -c", ccaddress, address,
    >>> "<", file, "2>/dev/null") } else cmdargs <- paste("-s
    >>> '", subject, "'", address, "<", file, "2>/dev/null")
    >>> status <- 1 cat("Submit the help request? ") answer <-
    >>> readline() answer <- grep("y", answer, ignore.case =
    >>> TRUE) if (length(answer) > 0) { cat("Sending email
    >>> ...\n") status <- system(paste("mailx", cmdargs)) if
    >>> (status > 0) status <- system(paste("Mail", cmdargs)) if
    >>> (status > 0) status <- system(paste("/usr/ucb/mail",
    >>> cmdargs)) if (status == 0) unlink(file) else {
    >>> cat("Sending email failed!\n") cat("The unsent help
    >>> request can be found in file", file, "\n") } } else
    >>> cat("The unsent help request can be found in file",
    >>> file, "\n") } else if (method == "ess") { body <-
    >>> gsub("\\\\n", "\n", body) cat(body) } }
    >>>
>>> -----------------------------------------------------------------------
    >>>
    >>> Gabor Grothendieck wrote:
    >>>> Here is another update.  I have added the following:
    >>>>
    >>>> - info about using a fresh R session.  (In that case
    >>>> ls() output is less essential; however, the developers
    >>>> of sessionInfo() might consider adding that as a
    >>>> default or as an option.)
    >>>>
    >>>> - questioner should consider use of functions.
    >>>>
    >>>> - for data use dump(x, file = "") to reproducibly
    >>>> display data or use builtin datasets listed by data()
    >>>>
    >>>> - minimal versions of slow code should be presented in
    >>>> cases where questioner is looking for faster code.
    >>>>
    >>>> - we still need to add links to illustrative sample
    >>>> questions in r-help
    >>>>
    >>>> The following were not added for the reason cited:
    >>>>
    >>>> - guide is not just for questioners.  Important to
    >>>> distinguish roles of questioner, responder and reader.
    >>>>
    >>>> - what is to be provided ought to be given a name to
    >>>> make it easier to refer to.  An unlabelled set of
    >>>> points is too vague.  Test framework seems
    >>>> appropriately descriptive.  By giving it a name one can
    >>>> request that a questioner "provide a test framework as
    >>>> defined in the posting guide summary".
    >>>>
    >>>> - self contained is not implied by reproducible.
    >>>> Reproducible only means that info is available
    >>>> somewhere -- not that its all available right in the
    >>>> questioner's post and all in a manner that is readily
    >>>> accessible.
    >>>>
    >>>> - focus should be on making data minimal.  Don't like
    >>>> attachments since responder must save them and read
    >>>> them in.  It encourages use of large rather than
    >>>> minimal data sets.
    >>>>
    >>>> Summary
    >>>>
    >>>> Surprisingly, the main problem for responders is not to
    >>>> answer the question but to quickly figure out what the
    >>>> question is, reproduce it in their own R session and
    >>>> test their answer.
    >>>>
    >>>> Test Framework.  To faciliate this provide a test
    >>>> framework of:
    >>>>
    >>>> (1) minimal reproducible self-contained commented code
    >>>> and data that has been run in a fresh R session.  That
    >>>> means code and data have been cut down as far as
    >>>> possible to the essentials needed to illustrate the
    >>>> problem and were run are just after starting up R.
    >>>> Also it means that its possible for responders to just
    >>>> copy the code and data section from the questioner's
    >>>> post to the clipboard and paste it into their session
    >>>> to see the same output without having to enter even one
    >>>> R command.  In some cases there may be an advantage to
    >>>> present the code as a function and in the case of
    >>>> needing a speedup be sure to post a minimal version of
    >>>> the slow code.  Use builtin data sets such as those
    >>>> listed by data() to illustrate problem or reduce your
    >>>> data to a minimum and present it reproducibly by using:
    >>>> dump("mydata", file = "")
    >>>>
    >>>> (2) comments/explanation of what the code is intended
    >>>> to produce -- Don't assume its obvious!
    >>>>
    >>>> (3) versions of all software used, e.g. sessionInfo(),
    >>>> or R.version.string; packageDescription("zoo")$Version
    >>>>
    >>>> Without self-contained reproducible code the responder
    >>>> must not only understand the question but must also
    >>>> create a test framework and that typically takes more
    >>>> time than answering the question!  Its not fair to ask
    >>>> the responder to provide all that on top of answering
    >>>> the question.  Do NOT assume the problem is so simple
    >>>> that it is not necessary.
    >>>>
    >>>> Effort. The effort taken to reduce the problem to its
    >>>> essentials and produce a test framework often solves
    >>>> the problem avoiding the need for a post in the first
    >>>> place.  It at the least shows that the questioner tried
    >>>> to solve it themself.
    >>>>
    >>>> Subscribers.  The questioner should ensure that the
    >>>> thread is complete and that it has an appropriate
    >>>> Subject.  The purpose of the post is not only to help
    >>>> the questioner but also the other list subscribers and
    >>>> those later searching the archives.
    >>>>
    >>>>
    >>>>
    >>>>
    >>>>
    >>>> On Sat, Jun 7, 2008 at 9:38 AM, Gabor Grothendieck
    >>>> <[EMAIL PROTECTED]> wrote:
    >>>>> Here is a second version of the summary.  Its been
    >>>>> rearranged to place most important info at top.  Also
    >>>>> shortened it a bit.
    >>>>>
    >>>>> It still needs links to example posts, as suggested.
    >>>>> Anyone?
    >>>>>
    >>>>> Summary
    >>>>>
    >>>>> Surprisingly, the main problem for responders is not
    >>>>> to answer the posted questions but to quickly figure
    >>>>> out what the question is, reproduce it in their own R
    >>>>> session and test their answer.
    >>>>>
    >>>>> Test Framework.  To faciliate that provide a test
    >>>>> framework of:
    >>>>>
    >>>>> (1) reproducible self-contained minimal code and data.
    >>>>> That means responders can copy it from the
    >>>>> questioner's post and paste it into their session to
    >>>>> see the same output without having to enter even one R
    >>>>> command.  NB. dput(mydata) produces mydata in
    >>>>> reproducible form.  (2) comments/explanations of what
    >>>>> the code is intended to produce and (3) versions of
    >>>>> all software used, e.g. sessionInfo().
    >>>>>
    >>>>> Without self-contained reproducible code the responder
    >>>>> must not only understand the question but must also
    >>>>> create a test framework and that typically takes more
    >>>>> time than answering the question!  Its not fair to ask
    >>>>> the responder to provide all that on top of answering
    >>>>> the question.  Do NOT assume the problem is so simple
    >>>>> that it is not necessary.
    >>>>>
    >>>>> Effort. The effort taken to reduce the problem to its
    >>>>> essentials and produce a test framework often solves
    >>>>> the problem avoiding the need for a post in the first
    >>>>> place.  It at the least shows that the questioner
    >>>>> tried to solve it themself.
    >>>>>
    >>>>> Subscribers.  The questioner should ensure that the
    >>>>> thread is complete and that it has an appropriate
    >>>>> Subject.  The purpose of the post is not only to help
    >>>>> the questioner but also the other list subscribers and
    >>>>> those later searching the archives.
    >>>>>
    >>>>>
    >>>>>
    >>>>> On Fri, Jun 6, 2008 at 1:30 PM, Gabor Grothendieck
    >>>>> <[EMAIL PROTECTED]> wrote:
 >>>>> People read the posting guide yet they are still unable to
    >>>>> create an
 >>>>> acceptable
 >>>>> post. e.g.
 >>>>> https://stat.ethz.ch/pipermail/r-help/2008-June/164092.html
    >>>>>>
 >>>>> I think the problem is that the guide is not clear or
    >>>>>> concise enough.
 >>>>> I suggest we add a summary at the beginning which gets to
    >>>>>> the heart
 >>>>> of what a poster is expected to provide:
    >>>>>>
 >>>>> Summary
    >>>>>>
 >>>>> To maximize your change of getting a response when posting
    >>>>>> provide (1)
 >>>>> commented,
 >>>>> (2) minimal, (3) self-contained and (4) reproducible code.
    >>>>>> (This one
 >>>>> line summary
 >>>>> also appears at the end of each message to r-help.)
    >>>>>>
 >>>>> "Self-contained" and "reproducible" mean that a responder
    >>>>>> can copy the
 >>>>> questioner's code to
 >>>>> the clipboard, paste it into their R session and see the
    >>>>>> same problem
 >>>>> you as the questioner
 >>>>> see.  Note that dput(mydata) will display mydata in a
    >>>>>> reproducible way.
 >>>>> Self-contained and reproducible are needed because:
 >>>>> (1) Self-Effort. It shows that the questioner tried to
    >>>>>> solve the
 >>>>> problem by themself first.
 >>>>> (2) Test framework. Often the responder needs to play with
    >>>>>> the code a
 >>>>> bit in order to respond
 >>>>> or at least to give the best answer.  They can't do that
    >>>>>> without a
 >>>>> test framework that includes
 >>>>> the data and the code to run it and its not fair to ask
    >>>>>> them to not
 >>>>> only answer the question but
 >>>>> also to come up with test data and to complete incomplete
    >>>>>> code.
 >>>>> (3) Archives. Questions and answers go into the archives
    >>>>>> so they are
 >>>>> not only for the benefit of
 >>>>> of the questioner but also for the benefit of all future
    >>>>>> searchers of
 >>>>> the archive.  That means
 >>>>> that its not finished if you have solved the problem for
    >>>>>> yourself.
 >>>>> You still need to ensure that
 >>>>> the thread has a complete solution. (For that reason its
    >>>>>> also
 >>>>> important to give a meaningful
 >>>>> subject to each post.)
    >>>>>>
 >>>>> "Commented" and "minimal" also reduce the time it takes to
    >>>>>> understand
 >>>>> the problem.
 >>>>> Don't just dump your code as is into the message since you
    >>>>>> are just
 >>>>> wasting your own
 >>>>> time. Its not likely anyone will answer a message if the
    >>>>>> questioner
 >>>>> has not taken the
 >>>>> time to reduce it to its essential elements.
    >>>>>> Surprisingly, quite
 >>>>> often understanding what
 >>>>> the problem is takes the responder most of the time -- not
    >>>>>> solving the
 >>>>> problem. Once the
 >>>>> question is actually understood its often quite fast to
    >>>>>> answer.  Thus
 >>>>> in addition to posting
 >>>>> it in a minimal form, comment on it sufficiently so that
    >>>>>> the responder
 >>>>> knows what the code
 >>>>> does and is intended to produce.  It may be obvious to the
    >>>>>> questioner
 >>>>> who is embroiled in
 >>>>> the problem but that does not mean its obvious to others.
    >>>>>>
 >>>>> Introduction
    >>>>>>
 >>>>> .... rest of posting guide ...
    >>>>>>
    >>>> ______________________________________________
    >>>> R-devel@r-project.org mailing list
    >>>> https://stat.ethz.ch/mailman/listinfo/r-devel
    >>> --
    >>> Dr H Turner Research Fellow Dept. of Statistics The
    >>> University of Warwick Coventry CV4 7AL
    >>>
    >>> Tel: 024 76575870 Fax: 024 76524532 Url:
    >>> www.warwick.ac.uk/go/heatherturner
    >>>

--
Dr H Turner
    HT> Research Fellow Dept. of Statistics The University of
    HT> Warwick Coventry CV4 7AL

    HT> Tel: 024 76575870 Fax: 024 76524532 Url:
    HT> www.warwick.ac.uk/go/heatherturner

    HT> ______________________________________________
    HT> R-devel@r-project.org mailing list
    HT> https://stat.ethz.ch/mailman/listinfo/r-devel

No virus found in this incoming message.
Checked by AVG.
Version: 8.0.100 / Virus Database: 270.2.0/1494 - Release Date: 6/10/2008 7:22 AM


--
Dr H Turner
Research Fellow
Dept. of Statistics
The University of Warwick
Coventry
CV4 7AL

Tel: 024 76575870
Fax: 024 76524532
Url: www.warwick.ac.uk/go/heatherturner
bug.report <- function(subject = "", ccaddress = Sys.getenv("USER"),
                       method = getOption("mailer"),
                       address = "[EMAIL PROTECTED]",
                       file = "R.bug.report")
{
    create.post(instructions = "\\n<<insert bug report here>>\\n\\n\\n\\n",
                description = "bug report",
                subject = subject,
                ccaddress = ccaddress,
                method = method,
                address = address,
                file = file)
}
create.post <- function(instructions = "\\n",
                        description = "post",
                        subject = "",
                        ccaddress = Sys.getenv("USER"),
                        method = getOption("mailer"),
                        address ="the relevant mailing list",
                        file = "R.post")
{
    methods <- c("mailx", "gnudoit", "none", "ess")

    method <-
        if(is.null(method)) "none"
        else methods[pmatch(method, methods)]

    body <- paste(instructions,
                  "--please do not edit the information below--\\n\\n",
                  "Version:\\n ",
                  paste(names(R.version),R.version, sep=" = ",collapse="\\n "),
                  if (nzchar(Sys.getenv("R_GUI_APP_VERSION")))
                      paste("\\n\\nGUI:\\n R-GUI 
",Sys.getenv("R_GUI_APP_VERSION"),
                            " (",Sys.getenv("R_GUI_APP_REVISION"),")",sep='')
                  else
                      ""
                  ,
                  "\\n\\n",
                  "Locale:\\n",
                  Sys.getlocale(),
                  "\\n\\n",
                  "Search Path:\\n ",
                  paste(search(), collapse=", "),
                  "\\n", sep="", collapse="")

    if(method == "gnudoit") {
        cmd <- paste("gnudoit -q '",
                     "(mail nil \"", address, "\")",
                     "(insert \"", body, "\")",
                     "(search-backward \"Subject:\")",
                     "(end-of-line)'",
                     sep="")
        system(cmd)
    }
    else if(method=="none"){

        disclaimer <-
            paste("# Your mailer is set to \"none\" (default on Windows),\n",
                  "# hence we cannot send the, ", description, " directly from 
R.\n",
                  "# Please copy the ", description, " (after finishing it) 
to\n",
                  "# your favorite email program and send it to\n#\n",
                  "#       ", address, "\n#\n",
                  "######################################################\n",
                  "\n\n", sep = "")


        cat(disclaimer, file=file)
        body <- gsub("\\\\n", "\n", body)
        cat(body, file=file, append=TRUE)
        cat("The", description, "is being opened for you to edit.\n")
        system(paste(getOption("editor"), file))
        cat("The unsent", description, "can be found in file", file, "\n")
    }
    else if(method == "mailx"){

        if(missing(subject)) stop("'subject' missing")

        body <- gsub("\\\\n", "\n", body)
        cat(body, file=file, append=FALSE)
        cat("The", description, "is being opened for you to edit.\n")
        system(paste(getOption("editor"), file))

        if(is.character(ccaddress) && nzchar(ccaddress)) {
            cmdargs <- paste("-s '", subject, "' -c", ccaddress,
                             address, "<", file, "2>/dev/null")
        }
        else
            cmdargs <- paste("-s '", subject, "'", address, "<",
                             file, "2>/dev/null")

        status <- 1

        answer <- readline(paste("Email the ", description, " now? (yes/no) ",
                                 sep = ""))
        answer <- grep("yes", answer, ignore.case=TRUE)
        if(length(answer)>0){
            cat("Sending email ...\n")
            status <- system(paste("mailx", cmdargs))
            if(status > 0)
                status <- system(paste("Mail", cmdargs))
            if(status > 0)
                status <- system(paste("/usr/ucb/mail", cmdargs))

            if(status==0) unlink(file)
            else{
                cat("Sending email failed!\n")
                cat("The unsent", description, "can be found in file",
                    file, "\n")
            }

        }
        else
            cat("The unsent", description, "can be found in file",
                file, "\n")

    }
    else if(method=="ess"){
        body <- gsub("\\\\n", "\n", body)
        cat(body)
    }
}
create.post <- function(instructions = "\\n",
                        description = "post",
                        subject = "",
                        ccaddress = Sys.getenv("USER"),
                        method = getOption("mailer"),
                        address = "the relevant mailing list",
                        file = "R.post")
{
    body <- paste(instructions,
                  "--please do not edit the information below--\\n\\n",
                  "Version:\\n ",
                  paste(names(version), version, sep=" = ", collapse="\\n "),
                  "\\n\\n",
                  win.version(),
                  "\\n\\n",
                  "Locale:\\n",
                  Sys.getlocale(),
                  "\\n\\n",
                  "Search Path:\\n ",
                  paste(search(), collapse=", "),
                  "\\n", sep="", collapse="")

    if (method == "none") {
        disclaimer <-
            paste("# R for Windows will not send your ", description,
                  " automatically.\n",
                  "# Please copy the ", description, " (after finishing it) 
to\n",
                  "# your favorite email program and send it to\n#\n",
                  "#       ", address, "\n#\n",
                  "######################################################\n",
                  "\n\n", sep = "")

        cat(disclaimer, file=file)
        body <- gsub("\\\\n", "\n", body)
        cat(body, file=file, append=TRUE)
        file.edit(file)
        cat("The unsent", description, "can be found in file",
            tools::file_path_as_absolute(file), "\n")
    }
    else if (method == "mailto") {
        if (missing(subject)) stop("'subject' missing")
        if (nchar(subject) < 1) subject <- "<<Enter Meaningful Subject>>"

        body <- gsub("\\\\n", "%0A", body)
        cat("The", description, "is being opened for you to edit and send.\n")
        mail <- try(shell(paste("start \"title\" \"mailto:";, address,
                                "?subject=", subject, "&body=", body,
                                sep = "")))
        if (inherits(mail, "try-error")) {
            body <- gsub("%0A", "\n", body)
            cat(body, file=file, append=TRUE)
            file.edit(file)
            cat("The unsent", description, "can be found in file",
                tools::file_path_as_absolute(file), "\n")
        }

    }
    invisible()
}

win.version <- function() .Internal(win.version())
help.request <- function (subject = "",
                          ccaddress = Sys.getenv("USER"),
                          method = getOption("mailer"),
                          address = "[EMAIL PROTECTED]",
                          file = "R.help.request") {
    no <- function(answer) answer == "n"
    yes <- function(answer) answer == "y"
    go <- function(url) {
        cat("Please do this first - the site has been loaded in your web 
browser\n")
        browseURL(url)
    }
    cat("Checklist:\n")
    post <- readline("Have you read the posting guide? (y/n) ")
    if (no(post)) return(go("http://www.r-project.org/posting-guide.html";))
    FAQ <- readline("Have you checked the FAQ? (y/n) ")
    if (no(FAQ)) return(go("http://cran.r-project.org/faqs.html";))
    intro <- readline("Have you checked An Introduction to R? (y/n) ")
    if (no(intro))
        return(go("http://cran.r-project.org/doc/manuals/R-intro.html";))
    NEWS <- readline("Have you checked the NEWS of the latest development 
release? (y/n) ")
    if (no(NEWS)) return(go("https://svn.r-project.org/R/trunk/NEWS";))
    rsitesearch <- readline("Have you looked on RSiteSearch? (y/n) ")
    if (no(rsitesearch)) {
        cat("Please do this first - the site has been loaded in your web 
browser\n")
        return(RSiteSearch(subject))
    }
    inf <- sessionInfo()
    if ("otherPkgs" %in% names(inf)){
        other <- readline("You have packages other than the base packages 
loaded.",
                          "\nIf your query relates to one of these, have you ",
                          "checked any corresponding books/manuals \nand ",
                          "considered contacting the package maintainer? 
(y/n/NA) ")
        if(no(other)) return("Please do this first.")
    }

    man <- url("http://cran.r-project.org/manuals.html";)
    ver <- scan(man, what = character(0), sep = "\n", skip = 13, nlines = 1,
                quiet = TRUE)
    ver <- strsplit(ver, " ")[[1]][3]
    if (getRversion() < numeric_version(ver)) {
        update <- readline("Your R version is out-of-date, would you like to 
update now? (y/n) ")
        if (yes(update)) {
            return(go(getOption("repos")))
        }
    }
    cat("Checking installed packages are up-to-date...\n")
    old <- old.packages()
    if (!is.null(old)) {
        cat("The following installed packages are out-of-date:\n",
            rownames(old), "\nwould you like to update now? (y/n)")
        if (yes(update)) {
            update.packages(ask = FALSE)
        }
    }

    ## To get long prompt!
    cat("Have you written example code that is\n",
        "- minimal\n - reproducible\n - self-contained\n - commented",
        "\nusing data that is either\n",
        "- constructed by the code\n - loaded by data()\n",
        "- reproduced using dump(\"mydata\", file = \"\")\n")
    code <- readline(paste("have you checked this code in a fresh R session",
                           "\n(invoking R with the --vanilla option if 
possible)",
                           "\nand is this code copied to the clipboard? (y/n) 
"))
    if (no(code))
        return(cat("\nIf your query is not directly related to code",
                   "(e.g. a general query \nabout R's capabilities),",
                   "email [EMAIL PROTECTED] directly. ",
                   "\nOtherwise prepare some example code first.\n"))
    change <- readline(paste("Would you like to change your subject line:\n",
                             subject, "\nto something more meaningful? (y/n) "))
    if (yes(change))
        subject <- readline("Enter subject: \n")

    create.post(instructions = paste(
                "\\n<<SEND AS PLAIN TEXT!>>\\n\\n",
                "\\n<<Write your query here, using your example code to 
illustrate>>",
                "\\n<<End with your name and affiliation>>\\n\\n\\n\\n"),
                description = "help request",
                subject = subject,
                ccaddress = ccaddress,
                method = method,
                address = address,
                file = file)
}
\name{help.request}
\alias{help.request}
\title{Send a Post to R-help}
\description{
  Prompts the user to check they have done all that is expected of them
  before sending a post to the R-help mailing list, provides a template
  for the post with session information included and optionally sends
  the email (on Unix systems).
\usage{
help.request(subject = "",
             ccaddress = Sys.getenv("USER"),
             method = getOption("mailer"),
             address = "[EMAIL PROTECTED]",
             file = "R.help.request")
}
\arguments{
  \item{subject}{Subject of the email. Please do not use single quotes
    (\code{'}) in the subject! Post separate help requests for multiple queries}
  \item{ccaddress}{Optional email address for copies (default is current
    user).  Use \code{ccaddress = FALSE} for no copies.}
  \item{method}{Submission method: for Unix one of \code{"mailx"},
    \code{"gnudoit"}, \code{"none"} or \code{"ess"}; for Windows either
    \code{"none"} (default) or \code{"mailto"}.}
  \item{address}{Recipient's email address.}
  \item{file}{File to use for setting up the email (or storing it when
    method is \code{"none"} or sending mail fails).}
}
\details{
  This function is not intended to replace the posting
  guide. Please read the guide before posting to R-help or using this
  function (see \url{http://www.r-project.org/posting-guide.html}).

  The \code{help.request} function:
  \itemize{
    \item{asks whether the user has consulted relevant resources,
      stopping and opening the relevant url if a negative response if
      given.} 
    \item{checks whether the current version of R is being used and
      whether the add-on packages are up-to-date, giving the option of
      updating where necessary.}
    \item{asks whether the user has prepared appropriate (minimal,
      reproducible, self-contained, commented) example code ready to
      paste into the post.}
  }
  Once this checklist has been completed a template post is prepared
  including current session information.

  If method is \code{"none"} or \code{NULL}, then the default text
  editor is opened for the user to complete the post. Which editor is
  used can be controlled using \code{\link{options}}, type
  \code{getOption("editor")} to see what editor is currently
  defined. Please use the help pages of the respective editor for
  details of usage. The report can then be copied to your favorite email
  program and sent to the r-help list.
  
  On Windows systems there is an experimental \code{"mailto"} option,
  which sends the template post to the system's default email program for
  the user to edit and send.
  
  On Unix systems there are three options for direct submission of the
  post. If the submission method is \code{"mailx"}, then the default
  editor is used to write the help request. After saving the help request
  (in the temporary file opened) and exiting the editor the report is
  mailed using a Unix command line mail utility such as \code{mailx}.  A
  copy of the mail is sent to the current user. If method is
  \code{"gnudoit"}, then an emacs mail buffer is opened and used for
  sending the email. If method is \code{"ess"} the body of the mail is
  simply sent to stdout.
}
\value{Nothing useful.}
\seealso{The posting guide
  (\url{http://www.r-project.org/posting-guide.html}), 
  also \code{\link{sessionInfo}()} from which you may add
  to the help request.}
\author{This help page is adapted from the Emacs manual and the R FAQ}
\keyword{utilities}
\keyword{error}
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to