【问题标题】:Concerning R, when defining a Replacement Function, do the arguments have to be named as/like "x" and "value"?关于 R,在定义替换函数时,参数是否必须命名为/类似于“x”和“value”?
【发布时间】:2014-09-01 18:41:18
【问题描述】:

我所说的“替换函数”是指在这个线程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

其他一些名字也很好用,如果它们类似于x和value,似乎:

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

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

这对我来说没有意义。变量的名称真的很重要还是我犯了一些错误?

【问题讨论】:

  • 我认为它可能已经传回给first0,尽管我不确定。好问题。

标签: r function


【解决方案1】:

这里发生了两件事。首先,替换函数唯一真正的规则是新值将作为名为@9​​87654322@ 的参数传递,它将是最后一个参数。这就是为什么当您指定签名 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=传递。这是唯一重要的参数名称。

【讨论】:

  • 感谢您的帮助!所以其中一个参数确实有一个固定的名字(我还是觉得这很奇怪!)。 a &lt;- 'first1&lt;-'(a, 9) 怎么样?不是和first1(a) &lt;- 9一样吗?为什么即使我使用first1 &lt;- function(somex, somevalue),前者也能工作,而后者却不能?
  • 当您调用a &lt;- 'first1&lt;-'(a, 9) 时,可以使用位置参数来解决。什么都没有命名。但是当 R 将 first1(a) &lt;- 9 转换为函数调用时,它会将其转换为 a &lt;- 'first1&lt;-'(a, value=9)。当您使用参数名称时,您不再使用位置参数。
猜你喜欢
  • 2013-07-18
  • 2020-03-07
  • 2015-11-16
  • 2014-11-09
  • 2012-01-24
  • 2020-09-16
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
相关资源
最近更新 更多