2015-04-06 46 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,他向我展示了如何创建它。 –