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

Qia*_*Qin 5 r function

通过"替换函数"我的意思是在这个线程中提到的什么是R中的替换函数?,看起来像'length<-'(x, value).当我使用这些功能时,我遇到了一些奇怪的东西.似乎替换函数仅在根据特定规则命名变量时才起作用.

这是我的代码:

a <- c(1,2,3)
Run Code Online (Sandbox Code Playgroud)

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

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

first0(a) <- 5
a
# returns [1] 5 2 3.
Run Code Online (Sandbox Code Playgroud)

第一个工作得很好......但是当我更改定义中的参数名称时,

'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
Run Code Online (Sandbox Code Playgroud)

它无法工作,但以下代码没问题:

a <- 'first1<-'(a, 9)
a
# returns [1] 9 2 3
Run Code Online (Sandbox Code Playgroud)

其他一些名字很好地工作也是如此,如果它们类似于xvalue,看来:

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

first2(a) <- 33
a
# returns [1] 33  2  3
Run Code Online (Sandbox Code Playgroud)

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

MrF*_*ick 9

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

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

f<-function(a, value1234=5) {
    print(value1234)
}    
f(value=5)
# [1] 5
Run Code Online (Sandbox Code Playgroud)

请注意,5返回.此行为在语言定义中的参数匹配下定义.

查看正在发生的事情的另一种方法是打印实际调用内容的调用签名.

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

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

  • 当你调用`a < - 'first1 < - '(a,9)`时,使用位置参数解析它.什么都没有命名.但是当R将`first1(a)< - 9`转换为函数调用时,它将它变成'a < - 'first1 < - '(a,value = 9)`.使用参数名称时,不再使用位置参数. (3认同)