-
Notifications
You must be signed in to change notification settings - Fork 1
Add an argufy_package function #5
Changes from 1 commit
3eaeede
ecf7069
abee667
8874c44
ff9c05f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
# Generated by roxygen2 (4.1.1): do not edit by hand | ||
|
||
export(argufy) | ||
export(argufy_package) | ||
export(as_enum) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
#' argufy all of the functions within a package | ||
#' | ||
#' This function is best placed either in the last file sourced (\code{zzz.R} | ||
#' or the last file listed in the collate directive) or in \code{.onLoad()}. | ||
#' @inheritParams argufy | ||
#' @param package the package to argufy | ||
#' @export | ||
argufy_package <- function(env = parent.frame(), ...) { | ||
if (is.character(env)) { | ||
env <- asNamespace(env) | ||
} | ||
|
||
argufy_environment(env, ...) | ||
|
||
argufy_S4(env, ...) | ||
|
||
invisible() | ||
} | ||
|
||
argufy_environment <- function(ns, ...) { | ||
nms <- ls(ns, all.names = TRUE) | ||
|
||
funs <- mget(nms, ns, mode = "function", ifnotfound = NA) | ||
|
||
funs <- funs[!is.na(funs)] | ||
|
||
Map (function(nme, fun) { | ||
fun <- argufy(fun, ...) | ||
assign(nme, fun, envir = ns) | ||
}, names(funs), funs) | ||
|
||
invisible() | ||
} | ||
|
||
argufy_S4 <- function(ns, ...) { | ||
generics <- getGenerics(ns) | ||
|
||
Map([email protected], generics@package, USE.NAMES = FALSE, | ||
f = function(name, package) { | ||
what <- methodsPackageMetaName("T", paste(name, package, sep = ":")) | ||
|
||
table <- get(what, envir = ns) | ||
|
||
argufy_environment(table, ...) | ||
}) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
% Generated by roxygen2 (4.1.1): do not edit by hand | ||
% Please edit documentation in R/argufy_package.R | ||
\name{argufy_package} | ||
\alias{argufy_package} | ||
\title{argufy all of the functions within a package} | ||
\usage{ | ||
argufy_package(env = parent.frame(), ...) | ||
} | ||
\arguments{ | ||
\item{...}{Function arguments to modify, this allows you to argufy existing | ||
function definitions.} | ||
|
||
\item{package}{the package to argufy} | ||
} | ||
\description{ | ||
This function is best placed either in the last file sourced (\code{zzz.R} | ||
or the last file listed in the collate directive) or in \code{.onLoad()}. | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
Package: TestS4 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would actually try something more automated first, like http://www.r-pkg.org/pkg/disposables There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agreed, I had not seen disposables before, seems perfect for this use case. |
||
Title: What the Package Does (one line, title case) | ||
Version: 0.0.0.9000 | ||
Authors@R: person("Jim", "Hester", email = "[email protected]", role = c("aut", "cre")) | ||
Description: What the package does (one paragraph). | ||
Depends: R (>= 3.3.0) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we really need R 3.3.0 for this? That is kinda bad. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, |
||
License: MIT + file LICENSE | ||
LazyData: true | ||
Suggests: argufy |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
exportPattern("^[^\\.]") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#' an example function | ||
#' | ||
#' @export | ||
a <- function(x = ~ is.numeric) { | ||
if (x) { | ||
1 | ||
} else { | ||
2 | ||
} | ||
} | ||
|
||
#' @export | ||
TestS4 <- setClass("TestS4", | ||
slots = list(name = "character", enabled = "logical")) | ||
|
||
#' @export | ||
setGeneric("paste2", function(x = ~ is.character, y) { | ||
standardGeneric("paste2") | ||
}) | ||
|
||
setMethod("paste2", | ||
signature(x = "character", y = "missing"), | ||
function(x) { | ||
paste(x) | ||
}) | ||
|
||
setMethod("paste2", | ||
c(x = "character", y = "ANY"), | ||
function(x, y = ~ is.character) { | ||
paste(x, y) | ||
}) | ||
|
||
argufy:::argufy_package("TestS4") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
{ | ||
temp_lib <- file.path(tempdir(), "lib") | ||
|
||
old <- .libPaths() | ||
.libPaths(temp_lib) | ||
on.exit(.libPaths(old)) | ||
tools:::.install_packages("TestS4") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think this will go through CRAN. Btw. why is it better than There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. CRAN doesn't check code in tests, but I agree it is not better than |
||
|
||
context("argufy_package") | ||
test_that("argufy_package works with simple functions", { | ||
|
||
expect_equal(TestS4::a(0), 2) | ||
|
||
expect_equal(TestS4::a(1), 1) | ||
|
||
expect_error(TestS4::a("a"), "is.numeric\\(x\\) is not TRUE") | ||
}) | ||
|
||
test_that("argufy_package works with S4 generics and methods", { | ||
|
||
expect_equal(TestS4::paste2("a"), "a") | ||
|
||
expect_equal(TestS4::paste2("a", "b"), "a b") | ||
|
||
# argufy set on generic | ||
expect_error(TestS4::paste2(1), "is.character\\(x\\) is not TRUE") | ||
|
||
# argufy set on method | ||
expect_error(TestS4::paste2("a", 1), "is.character\\(y\\) is not TRUE") | ||
}) | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,4 @@ | ||
|
||
context("") | ||
context("coercions") | ||
|
||
test_that("as_enum works", { | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Btw. I think it is nice to have independent changes like this and the next chunk in a separate commit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, this is not quite good, because
attr(, "srcref")
is copied as well, and it is used for printing the (new) function. I am not entirely sure what to do with this, though. If we don't copy, then the new function will have nosrcref
, which might be a problem sometimes, no? But we also do not want to reparse the function....There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That is true. In some respects the
srcref
version is more useful interactively, because the function definition is not cluttered by the additional checking code (which will become a larger problem when inlining functions (#6)). On the other hand the printed function is not exactly what is called by R, which may make things confusing.It is possible to view the real source with
print(fun, useSource = FALSE)
even with the copied srcref.The only downside to not having a
srcref
at all is that you lose comments and formatting, because R then simply prints the parsed expressions, it shouldn't actually cause any errors anywhere though.I personally would lean towards leaving the srcref copied as it is, but if you feel it is confusing simply dropping that attribute shouldn't cause any problems.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the code can be printed easily then it is fine as it is now. I'll just add it to the docs. This confused me until I debugged
argufy()
, because it did not seem to do anything. :)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed I was confused as well, easy way to see the real function definition
is
body(fun)
orprint(fun, useSource = FALSE)
On Tue, Aug 11, 2015 at 4:41 PM, Gábor Csárdi [email protected]
wrote: