2015-04-06 49 views
2

就R語言也有類似的名稱和dimnames一些功能,你可以作爲例子給它們賦值:如何賦值函數中的R

x <- list('foo'=2, boo=3) 
names(x) # This returns ("foo", "boo") vector 
names(x) <- c("moo", "doo") # Changes existing item names to ("moo", "doo") 

我的問題是如何這顯然創建這樣的功能,它們充當集合並同時獲得功能。

+1

也許'setNames(列表( '富'= 2,噓聲= 3),C( 'も', '鬥')) ' – akrun

+2

'name'和'names <-'實際上是不同的功能。它們是泛型,所以你可以爲它們定義方法。 – Roland

+1

@Roland據我的理解,你的評論中有一個函數'names <-'用於改變names屬性。如果您告訴我如何創建任何函數,可以說'func <-',以便我可以更改其他屬性,那麼我將非常感謝。 –

回答

5

您遇到了一種特殊的功能。從language definition (section 3.1.3 Function calls)

一種特殊類型的函數調用可以對 賦值運算符的左側顯示爲

class(x) <- "foo"

該語句確實是調用函數class<-與原始對象和右側。 該函數執行對象的修改並返回 結果,然後將結果存回原始變量。 (至少 概念,這是會發生什麼。一些額外的努力是爲了 避免不必要的數據重複。製造)

這樣的功能是.Primitive功能。他們調用內部的C代碼。通常它們是通用函數,這意味着您可以爲它們定義方法。

@alexis_laz演示如何在his comment創建這樣的功能:

second <- function(x) x[2] 
"second<-" <- function(x, value) { x[2] <- value; x } 
xx <- 1:3 
second(xx) 
#[1] 2 
second(xx) <- 4 
xx 
#[1] 1 4 3 
+0

謝謝。雖然這不是一個解決方案,但它可能是一個很好的跡象,我應該停止在這個方向上再尋找。 –

+0

@ PollaA.Fattah請參閱編輯。 – Roland

+0

這就是我在尋找如此多的感謝,指出我需要這種功能,並感謝@alexis_laz,他向我展示瞭如何創建它。 –