2016-05-18 8 views
-1

本書では、章の10/23ページ、Iteration vs. Recursionの練習問題があります。 nameのバインディングが含まれているすべての環境を見つけるために、修正where()`Advanced R` book:` name`のバインドを含むすべての環境を見つける

です。

ここで、where()pryrパッケージからです。まず第一に、何が尋ねられるのかを理解するために:meanという名前があるとします。これは、を参照してください可能性:

> mean 
function (x, ...) 
UseMethod("mean") 
<bytecode: 0x2234b58> 
<environment: namespace:base> 

しかし、また、私は同じ名前の変数に値を代入言う:だから

> mean <- 3 
> mean 
[1] 3 

、今(私が間違っている場合は、私を修正してください)、前者のmeanbaseenv()であり、後者はglobalenv()である。正しい?

> ls(as.environment(globalenv())) 
[1] "mean" 
> which(ls(as.environment(baseenv()))=="mean") 
[1] 671 

だから私は書いた:pryrパッケージからwhere機能に触発

where2 <- function(k, name, env) { 
    stopifnot(is.character(name), length(name) == 1) 

    # Why does this only work when calling 'where' from 
    # the 'pryr' package? 
    # env <- to_env(env) 

    # Hopefully the same as 'to_env'. 
    # env <- as.environment(env) 

    # Successful case. 
    if(exists(name, env, inherits=FALSE)) { 
    k <- list(k, env) 
    where2(k, name, parent.env(env)) 
    } 

    # Base case or search one level up. 
    if(identical(env, emptyenv())) { 
    stop("Can't find ", name, call.=FALSE) 
    } else { 
    where2(k, name, parent.env(env)) 
    } 
} 

を。リストには、ベース - と地球環境をcontainint

> source("./where2.r") 
> mean <- 3 
> k <- list() 
> where2(k, "mean", parent.frame()) 
Error: Can't find mean 

をしてもらう:

私は今(Rプロンプトで)行うことができます願っていました。

どうすればよいのですか?

+0

あなたは '' [1]「.GlobalEnv」にもたらされる '(「平均」)を見つけるを使用することができ、「平均」という名前のオブジェクトが含まれているすべての環境を確認するには"package:base" ' –

答えて

1

この関数は、問題を解決:

where_2 = function (name, env = parent.frame(), env_list = list()) 
{ 

    stopifnot(is.character(name), length(name) == 1) 
    env <- as.environment(env) 
    if (identical(env, emptyenv())) { 
    if (length(env_list) == 0) { 
     stop("Can't find ", name, call.=FALSE) 
    } else { 
     return(env_list) 
    } 
    } else if (exists(name, env, inherits = FALSE)) { 
    env_list = append(env_list, env) 
    where_2(name, parent.env(env), env_list = env_list) 
    } 
    else { 
    where_2(name, parent.env(env), env_list = env_list) 
    } 
} 
関連する問題