关于R,在定义替换函数时,参数必须命名为/ like“x”和“value”吗?

时间:2014-09-01 18:41:18

标签: r function

通过&#34;替换功能&#34;我的意思是这个帖子What are Replacement Functions in R?中提到的那些,看起来像'length<-'(x, value)。当我使用这些功能时,我遇到了一些奇怪的东西。似乎替换函数仅在根据特定规则命名变量时才起作用。

这是我的代码:

a <- c(1,2,3)

我将尝试使用以下3个替换函数之一更改a的第一个元素。

'first0<-' <- function(x, value){
  x[1] <- value
  x
}

first0(a) <- 5
a
# returns [1] 5 2 3.

第一个效果很好......但是当我在定义中更改参数名称时,

'first1<-' <- function(somex, somevalue){
  somex[1] <- somevalue
  somex
}

first1(a) <- 9
# Error in `first1<-`(`*tmp*`, value = 9) : unused argument (value = 9)
a
# returns [1] 5 2 3

虽然以下代码没问题,但无法正常工作:

a <- 'first1<-'(a, 9)
a
# returns [1] 9 2 3

其他一些名称也很有效,如果它们与xvalue类似,似乎:

'first2<-' <- function(x11, value11){
  x11[1] <- value11
  x11
}

first2(a) <- 33
a
# returns [1] 33  2  3

这对我没有意义。变量的名称实际上是重要的还是我犯了一些错误?

1 个答案:

答案 0 :(得分:9)

这里有两件事。首先,替换函数唯一真正的规则是新值将作为名为value的参数传递,它将是最后一个参数。这就是为什么当您指定签名function(somex, somevalue)时,您会收到错误unused argument (value = 9)并且分配无效。

其次,由于R中参数名称的部分匹配,事情与签名function(x11, value11)一起使用。考虑这个例子

f<-function(a, value1234=5) {
    print(value1234)
}    
f(value=5)
# [1] 5

请注意,会返回5。此行为在语言定义中的argument matching下定义。

另一种查看正在进行的操作的方法是打印实际呼叫内容的呼叫签名。

'first0<-' <- function(x, value){
    print(sys.call())
    x[1] <- value
    x
}
a <- c(1,2,3)
first0(a) <- 5
# `first0<-`(`*tmp*`, value = 5)

因此第一个参数实际上作为未命名的位置参数传递,新值作为命名参数value=传递。这是唯一重要的参数名称。