【问题标题】:R: Store similar functions in named environmentsR:在命名环境中存储类似的功能
【发布时间】:2016-12-26 00:55:20
【问题描述】:

我发现在环境中对类似功能进行分组很方便。

myenv <-  new.env()
f <- function() print(1)
assign("f", f, myenv)
rm(f) # use before attach to avoid  "object is masked" message
attach(myenv)
rm(myenv)

这样我就可以把相关的函数一起列出来了:

ls("myenv")
# [1] "f"   # and any other possible function defined in myenv

无论如何,当我打印函数时:

f
# function() print(1)
# <environment: 0x000000001df15d80>

我只获得了对环境哈希的引用,而获得对包的实际名称的引用会很好:

sd
function (x, na.rm = FALSE) 
sqrt(var(if (is.vector(x) || is.factor(x)) x else as.double(x), 
    na.rm = na.rm))
<bytecode: 0x000000001c01d8a8>
<environment: namespace:stats>

是否有可能或我必须创建一个包?

【问题讨论】:

  • @thelatemail:除非您认为我的重复,否则您可以发布一个答案,我可以接受。
  • @thelatemail:经过验证,我发现它不适用于打印功能,而仅适用于环境。

标签: r namespaces


【解决方案1】:

代码有点多,方便存放在单独的函数中。

print.store.f <- function(x, useSource = TRUE, ...) {
    class(x) <- NULL
    print.function(x, useSource = TRUE, ...)
    cat("<environment: myEnv>\n")
}
storeInEnv <- function(fun, env){
    if( ! env  %in% search()) attach(new.env(), name=env)        
    assign(fun, get(fun, parent.frame()), as.environment(env))
    eval(parse(t=sprintf("class(%s) <- 'store.f'", fun)), as.environment(env))
    rm(list=fun, pos=parent.frame())
}

现在,在创建一个函数之后:

f <- function() print(1)

可以将其存储在必要时创建的环境中,

storeInEnv("f", "myenv")  

现在:

f
# function() print(1)
# <environment: myEnv>

注意该函数已从全局环境中移除,仅存在于myenv

getAnywhere(f)
# A single object matching 'f' was found
# It was found in the following places
#   myenv
# with value
#  
# function() print(1)
# <environment: myEnv>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2015-11-10
    • 2015-03-03
    • 2021-01-22
    相关资源
    最近更新 更多