blob: c4b2d6ded7c5c739d8711a020cb2329879e32a62 [file] [log] [blame]
# File src/library/utils/R/unix/help.request.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2017 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
help.request <- function (subject = "", address = "r-help@R-project.org",
file = "R.help.request", ...)
{
webpage <- "corresponding web page"
catPlease <- function()
cat("Please do this first - the",
webpage,"has been loaded in your web browser\n")
go <- function(url) {
catPlease()
browseURL(url)
}
MyWrap <- function(...)
paste(paste(strwrap(paste(...)), collapse="\n"))
checkPkgs <- function(pkgDescs,
pkgtxt = paste("packages",
paste(names(pkgDescs), collapse=", ")))
{
cat("Checking if", pkgtxt, "are up-to-date; may take some time...\n")
stopifnot(sapply(pkgDescs, inherits, what="packageDescription"))
fields <- .instPkgFields(NULL)
n <- length(pkgDescs)
iPkgs <- matrix(NA_character_, n, 2L + length(fields),
dimnames=list(NULL, c("Package", "LibPath", fields)))
for(i in seq_len(n)) {
desc <- c(unlist(pkgDescs[[i]]),
"LibPath" = dirname(dirname(dirname(attr(pkgDescs[[i]],
"file")))))
nms <- intersect(names(desc), colnames(iPkgs))
iPkgs[i, nms] <- desc[nms]
}
old <- old.packages(instPkgs = iPkgs)
if (!is.null(old)) {
update <- askYesNo(MyWrap("The following installed packages are out-of-date:\n",
paste(strwrap(rownames(old),
width = 0.7 *getOption("width"),
indent = 0.15*getOption("width")),
collapse="\n"),
"would you like to update now?"))
if (is.na(update)) stop("Cancelled by user")
if (isTRUE(update)) update.packages(oldPkgs = old, ask = FALSE)
}
}
cat("Checklist:\n")
post <- askYesNo("Have you read the posting guide?")
if (!isTRUE(post)) return(go("https://www.r-project.org/posting-guide.html"))
FAQ <- askYesNo("Have you checked the FAQ?")
if (!isTRUE(FAQ)) return(go("https://cran.r-project.org/faqs.html"))
intro <- askYesNo("Have you checked An Introduction to R?")
if (!isTRUE(intro))
return(go("https://cran.r-project.org/manuals.html"))
NEWS <- askYesNo(MyWrap("Have you checked the NEWS of the latest development release?"))
if (!isTRUE(NEWS)) return(go("https://cran.r-project.org/doc/manuals/r-devel/NEWS.html"))
rsitesearch <- askYesNo("Have you looked on RSiteSearch?")
if (!isTRUE(rsitesearch)) {
catPlease()
return(RSiteSearch(subject))
}
inf <- sessionInfo()
if ("otherPkgs" %in% names(inf)) {
oPkgs <- names(inf$otherPkgs)
## FIXME: inf$otherPkgs is a list of packageDescription()s
other <-
askYesNo(MyWrap("You have packages",
paste0("(", paste(sQuote(oPkgs), collapse=", "),")"),
"other than the base packages loaded. ",
"If your query relates to one of these, have you ",
"checked any corresponding books/manuals and",
"considered contacting the package maintainer?"))
if(!isTRUE(other)) return("Please do this first.")
}
page <- url("https://cran.r-project.org/bin/windows/base")
title <- try(grep("<title>", readLines(page, 10L), fixed = TRUE, value = TRUE),
silent = TRUE)
if (!inherits(title, "try-error")) {
ver <- sub("^.*R-([^ ]*) for Windows.*$", "\\1", title)
if (getRversion() < numeric_version(ver)) {
update <- askYesNo(MyWrap("Your R version is out-of-date,",
"would you like to update now?"))
if (is.na(update)) stop("Cancelled by user")
if(isTRUE(update)) return(go(getOption("repos")))
}
} else
warning("Unable to connect to CRAN to check R version.")
if ("otherPkgs" %in% names(inf)) {
checkPkgs(inf$otherPkgs)
}
## A long prompt!
code <- askYesNo(paste0("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",
MyWrap("and have you checked this code in a fresh R session",
"(invoking R with the --vanilla option if possible)",
"and is this code copied to the clipboard?")))
if (!isTRUE(code))
return(cat("\nIf your query is not directly related to code",
"(e.g. a general query \nabout R's capabilities),",
"email R-help@r-project.org directly. ",
"\nOtherwise prepare some example code first.\n"))
change <- askYesNo(MyWrap("Would you like to change your subject line: ",
dQuote(subject), " to something more meaningful?"))
if (is.na(change)) stop("Cancelled by user")
if (isTRUE(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, address = address,
filename = file, info = bug.report.info(), ...)
}