我刚读完R简介中的范围界定,对这项<<-任务非常好奇.
手册显示了一个(非常有趣)的例子<<-,我觉得我理解.我仍然缺少的是这可能有用的背景.
因此,我希望从您那里读到的是关于何时使用<<-可能有趣/有用的示例(或示例链接).使用它的危险可能是什么(它看起来容易松散),以及您可能想要分享的任何提示.
这个问题来自一系列其他问题,这些问题都涉及到同样的问题.出于某些奇怪的原因,在第二个函数中找不到第一个函数的局部环境中定义的变量的意义上,在另一个函数中使用函数有时会失败.
伪代码中的经典模式:
ff <- function(x){
y <- some_value
some_function(y)
}
ff(x)
Run Code Online (Sandbox Code Playgroud)
eval(expr,envir,enclos)中的错误:找不到对象'y'
首先我认为它与S4方法和那里的范围有关,但它也与其他函数一起发生.我和R开发团队进行了一些互动,但是他们所做的只是让我直接进入错误报告站点(我不得不说,这不是最吸引人的站点).我从来没有得到任何反馈.
随着问题不断出现,我想知道是否有一个逻辑解释.在所有这些情况下是否是一个常见的错误,如果是这样,哪一个?或者它真的是一个错误?
其中一些问题:
PS:我知道R-devel列表,万一你想知道......
我定义了一个函数:
.get <- function( o, ...) {
p <- match.call( expand.dots = 0)$...
cat( sprintf( 'In .get, it is %s.\n', eval( tail( p, 1)[[ 1]])))
fn <- switch( typeof( o), list =, environment = `[[`, 'S4' = '@', `[`)
if( length( p)) eval( as.call( c( fn, quote( o), p))) else o # Here when true, I compose a call based on p.
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试如下:
it <- 1
m <- matrix( seq( 9), 3)
sapply( seq( 3), function( it) {
cat( …Run Code Online (Sandbox Code Playgroud) 关于范围,环境和功能的讨论已经很多.参见此处或此处.但是,我不确定我是否找到了解决以下问题的好方法:
df <- data.frame(id=rep(LETTERS[1:2],each=2), x=1:4)
d <- -1
myfun <- function(df, d){
require(plyr)
new.dat <- ddply(df, .(id), transform, x=x*d)
return(new.dat)}
myfun(df, 1)
Run Code Online (Sandbox Code Playgroud)
您可以轻松验证是否使用了全局定义d=-1,而不是d=1参数中提供的内容.(如果不d存在全局定义,则object not found返回消息)现在最大的问题是:如何d使用所使用的函数而不是全局定义的参数d?
我的印象是以下应该有效:
myfun2 <- function(df, d){
here <- environment()
new.dat <- ddply(df, .(id), transform, x=x*with(here,d))
return(new.dat)}
myfun2(df, 1)
Run Code Online (Sandbox Code Playgroud)
我的理解是从环境中with(here, d)检索对象.所以,结果应该是.但是,返回错误,说dhere1
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'closure'
Run Code Online (Sandbox Code Playgroud)
我不确定我理解为什么这不起作用,如果有人能够对此有所了解,或者如果你能提供替代解决方案,我会很高兴.请注意,将整个 …
给定一个environment对象e:
> e
<environment: 0x10f0a6e98>
> class(e)
[1] "environment"
Run Code Online (Sandbox Code Playgroud)
如何访问环境中的变量?
万一你好奇,我发现自己有这个environment对象.我没有制作它,Bioconductor的包装制作了它.您也可以使用以下命令制作它:
library('GEOquery')
eset <- getGEO("GSE4142")[[1]]
e <- assayData(eset)
Run Code Online (Sandbox Code Playgroud)