2017-04-16 9 views
0

私はAdvanced RをHadleyが読んでいます。私は第10章「機能プログラミング」に目を向けています。これは、http://adv-r.had.co.nz/Functional-programming.htmlの「グローバル環境下での関数のリストの移動」というタイトルでもご覧になれます。グローバル環境への関数のコピー

ここでは、コードです:

simple_tag <- function(tag) { 
    force(tag) 
    function(...) { 
    paste0("<", tag, ">", paste0(...), "</", tag, ">") 
    } 
} 
tags <- c("p", "b", "i") 
html <- lapply(setNames(tags, tags), simple_tag) 

私の質問は、彼は「私は彼らがすべての時間を利用できるようにしたくないので、私は、リスト内の関数を入れているを言う、なぜ私がいないということですが、既存のR関数とHTMLタグが競合する危険性が高い...最後にlist2env()で関数をグローバル環境にコピーする完了後に関数を削除することで元に戻すことができます。 "

これは、私

exists("html",envir = globalenv()) 

上記のコードはTRUEを返し、htmlはすでに地球環境に存在することを意味します。次のコードを実行します。だから私は本当に彼がなぜ「あなたは地球環境に機能をコピーすることができるのか」とはっきりしていません...「私は彼が間違っていることはないと認識しています。だから、私は専門家のためにこの質問を投稿することを考えました。私が実行した場合

さらに、:

where("html") 

は、私が手に:上記のコードから

<environment: R_GlobalEnv> 
attr(,"path") 

、それはすでに地球環境にあるhtmlリストのように聞こえます。ではない?

ご協力いただきありがとうございます。前もって感謝します。

答えて

4

htmlではなくの関数ですが、where("html")で示すように地球環境に保存されているオブジェクトです。むしろ、htmlは3つの関数を含むリストです。引数でhtml$p():あなたが使用html内部の機能の一つにアクセスするには

names(html) 
# [1] "p" "b" "i" 

。参照:

html$p 
# function(...) { 
#  paste0("<", tag, ">", paste0(...), "</", tag, ">") 
# } 
# <environment: 0x1093fe698> 

list2env()は、地球環境にhtml内の機能が保存されます。 p変数や関数は、地球環境にすでに存在している場合は、list2envを使用する場合など

p  # < DOESN'T exist in global environment 
# Error: object 'p' not found 

list2env(html,envir = globalenv()) 
p  # < DOES exist in global environment 
# function(...) { 
#  paste0("<", tag, ">", paste0(...), "</", tag, ">") 
# } 
# <environment: 0x1093fe698> 

のためにしかし、それは上書きされます。 htmlタグの名前が非常に短いため、htmlタグを上書きするリスクは高いです。そのため、既に使用しているパッケージにpb、またはiの機能がある可能性があります。

関連する問題