| # File src/library/base/R/formals.R |
| # Part of the R package, https://www.R-project.org |
| # |
| # Copyright (C) 1995-2018 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/ |
| |
| formals <- function(fun = sys.function(sys.parent()), envir = parent.frame()) { |
| if(is.character(fun)) |
| fun <- get(fun, mode = "function", envir = envir) |
| .Internal(formals(fun)) |
| } |
| |
| body <- function(fun = sys.function(sys.parent())) { |
| if(is.character(fun)) |
| fun <- get(fun, mode = "function", envir = parent.frame()) |
| .Internal(body(fun)) |
| } |
| |
| alist <- function (...) as.list(sys.call())[-1L] |
| |
| `body<-` <- function (fun, envir = environment(fun), value) { |
| if(!is.function(fun)) warning("'fun' is not a function") # TODO[2017]: stop() |
| if (is.expression(value)) { |
| if (length(value) > 1L) |
| warning("using the first element of 'value' of type \"expression\"") |
| value <- value[[1L]] |
| } |
| as.function(c(as.list(formals(fun)), list(value)), envir) |
| } |
| |
| `formals<-` <- function (fun, envir = environment(fun), value) |
| { |
| if(!is.function(fun)) warning("'fun' is not a function") # TODO[2017]: stop() |
| bd <- body(fun) |
| as.function(c(value, |
| if(is.null(bd) || is.list(bd)) list(bd) else bd), |
| envir) |
| } |