通過玩弄R中的一個函數,我發現它有更多的方面,而不是滿足眼睛。什麼/哪裏是一個函數對象的屬性?
考慮的部份簡單的功能分配,直接在控制檯輸入:
f <- function(x)x^2
通常的「屬性」的f
,在廣義上,是(i)的正式參數列表,(二)身體表達和(iii)將成爲功能評估框架的環境。他們都可以訪問通過:
> formals(f)
$x
> body(f)
x^2
> environment(f)
<environment: R_GlobalEnv>
此外,str
回報更多信息附加到f
:
> str(f)
function (x)
- attr(*, "srcref")=Class 'srcref' atomic [1:8] 1 6 1 19 6 19 1 1
.. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x00000000145a3cc8>
讓我們試着聯繫他們:
> attributes(f)
$srcref
function(x)x^2
這被打印成文字,但它存儲爲數字矢量:
> c(attributes(f)$srcref)
[1] 1 6 1 19 6 19 1 1
這個對象也有自己的屬性:
> attributes(attributes(f)$srcref)
$srcfile
$class
[1] "srcref"
第一個是環境,與3個內部對象:
> mode(attributes(attributes(f)$srcref)$srcfile)
[1] "environment"
> ls(attributes(attributes(f)$srcref)$srcfile)
[1] "filename" "fixedNewlines" "lines"
> attributes(attributes(f)$srcref)$srcfile$filename
[1] ""
> attributes(attributes(f)$srcref)$srcfile$fixedNewlines
[1] TRUE
> attributes(attributes(f)$srcref)$srcfile$lines
[1] "f <- function(x)x^2" ""
你來了!這是R用來打印attributes(f)$srcref
的字符串。
所以問題是:
是否有鏈接到
f
任何其他對象?如果是這樣,如何達到他們?如果我們剝去其屬性
f
,使用attributes(f) <- NULL
,它似乎不會影響功能。這樣做有什麼缺點嗎?
我非常懷疑你的#2索賠。除非你擊敗了一個剝離函數,包括間接環境調用,修改它的'body'元素,而不是很多我不知道的東西,你可能想要鍛鍊那個語句。 – 2013-04-09 19:54:11
@CarlWitthoft,我嘗試使用具有不同於'R_GlobalEnv'環境的函數的'attributes(f)< - NULL'(並且實際上在其外殼中查找符號),它仍然有效。另外,使用'body <-'會自動從其屬性中剝離函數。考慮到下面的Josh的回答,甚至有一個選項可以從頭開始保留這些屬性。你能提出另一個需要屬性的測試嗎? – 2013-04-10 03:09:15