I'm fairly new to R, and have checked the R FAQ and done an RSiteSearch for help on this topic, to no avail. I want to write some R code that has functions at the top-level that are not visible when the code is loaded. So in fun1 <- function(...) { ... } fun2 <- function(...) { ... fun1 ...} I'd like fun2 to be callable, but have fun1 be invisible. That is, the scope of fun1 is limited to the file in which it's defined. In Python, I believe that prepending an underscore to a variable name limits its scope in this way. Is there a similar mechanism in R? -- Paul
On 31/01/2014 1:46 PM, Paul A. Steckler wrote:> I'm fairly new to R, and have checked the R FAQ and done an RSiteSearch for help > on this topic, to no avail. > > I want to write some R code that has functions at the top-level that > are not visible when > the code is loaded. So in > > fun1 <- function(...) { ... } > > fun2 <- function(...) { ... fun1 ...} > > I'd like fun2 to be callable, but have fun1 be invisible. That is, the > scope of fun1 is > limited to the file in which it's defined. > > In Python, I believe that prepending an underscore to a variable name > limits its scope in this way. > Is there a similar mechanism in R?There are a couple ways. The heavyweight way is to write a package that exports fun2 but not fun1. fun2 can see fun1, but the rest of the world can't. Scope isn't limited to one file, any function in the package can see it. The lightweight way is to define fun1 and fun2 in a local scope, e.g. fun3 <- local({ fun1 <- function(...) { ... } fun2 <- function(...) { ... fun1 ...} fun2 }) This way fun1 and fun2 can see each other but nobody else can see them, and fun3 is a copy of fun2 that is visible in the workspace. You don't need a third name, I just changed it to make the explanation easier. Duncan Murodch
One option that I have not seen mentioned yet, and may be the most similar to the Python approach is to name the "Invisible" function starting with a "." (the period). Then the function will not appear when you do `ls()` but is still accessible. It however is not limited in scope and it is still callable by anyone (and `ls(all=TRUE)` will show it). This does not give the control that packages or local environments do, but it is a quick and easy way to have something that "hidden". On Fri, Jan 31, 2014 at 11:46 AM, Paul A. Steckler <steck at stecksoft.com> wrote:> I'm fairly new to R, and have checked the R FAQ and done an RSiteSearch for help > on this topic, to no avail. > > I want to write some R code that has functions at the top-level that > are not visible when > the code is loaded. So in > > fun1 <- function(...) { ... } > > fun2 <- function(...) { ... fun1 ...} > > I'd like fun2 to be callable, but have fun1 be invisible. That is, the > scope of fun1 is > limited to the file in which it's defined. > > In Python, I believe that prepending an underscore to a variable name > limits its scope in this way. > Is there a similar mechanism in R? > > -- Paul > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Gregory (Greg) L. Snow Ph.D. 538280 at gmail.com