【问题标题】:Call "self" in R function as an argument在 R 函数中调用“self”作为参数
【发布时间】:2014-11-14 15:56:34
【问题描述】:

我想知道在 R 函数中是否有一种优雅的方式来调用“self”。一个简单的例子是修改日期,假设 a 是 int 格式的日期(就像从 excel 中读取时一样)。

a = 41557
a = as.Date(a, origin = "1899-12-30")

然后用正确的格式更新“a”。显然这个例子非常简单,但是在长变量或更复杂的过程的上下文中,人们想使用像“self”这样的东西。 R 中是否存在这样的东西。 Self 仅仅意味着取 = 符号左侧的变量。

a = 41557
a = as.Date(self, origin = "1899-12-30") # what to use for self. 

作为第一个提示,我发现(我认为)某些函数可以使用“

"minc<-" <- function(x, value){x*value}

给:

a = 2
a = minc(12)
# a = 24, which is basically : a = self*12

我不知道 R 中是否存在这样的关键字,但它肯定有助于我的大多数代码的可读性。

一如既往,感谢您的帮助!

罗曼。

【问题讨论】:

  • 我不关注。什么是self。也许你想要Recall
  • 你会打电话给minc(a) &lt;- 12
  • @Thomas,self 只是一种说法“使用 = 运算符之前的对象作为参数”我会试一试 Recall 从未使用过它。
  • 你想做什么foo&lt;-some_function(foo)做不到的?我怀疑您是在尝试将其他语言的语法应用于R,而不是尝试翻译您想要的功能。
  • @CarlWitthoft 你是对的,它可以通过foo&lt;-some_function(foo) 直接实现,这就是我在初始帖子(第一个代码部分)中解释的内容。 “self”只是任何面向对象语言中的一个关键词。我只是在寻找一种优雅的方式来完成这个过程,因为如果变量的名称很长(例如,它在嵌套列表中很远),那么代码就会变得难以阅读。

标签: r function self


【解决方案1】:

您正在寻找的功能在出色的magrittr 包中实现。 CRAN 上的版本引入了一个管道运算符 %&gt;%,它将前面的内容作为其后面的第一个参数传递(默认情况下),或者将 . 替换为前面的语句。

更重要的是,Github 上的版本引入了许多管道变体,包括 %&lt;&gt;%,它与常规管道一样工作,但包含一个覆盖分配。

以下语句是等效的(magrittr 版本 >= 1.1.0,在 Github 上可用,devtools::install_github("smbache/magrittr")):

a = as.Date(a, origin = "1899-12-30")
a = a %>% as.Date(origin = "1899-12-30")
a %<>% as.Date(., origin = "1899-12-30")
a %<>% as.Date(origin = "1899-12-30")

【讨论】:

  • 正是我想要的。谢谢!
【解决方案2】:

替换函数可以这样使用:

1) as.Date

"as.Date<-" <- function(x, value) as.Date(x, origin = value)

现在测试一下:

a <- 41557
as.Date(a) <- "1899-12-30"
a
## [1] 2013-10-10

2) minc

"minc<-" <- function(x, value) x * value

现在测试一下:

a <- 2
minc(a) <- 12
a
## [1] 24

注意:如果您愿意,可以使用self 代替x

"as.Date<-" <- function(self, value) as.Date(self, origin = value)
"minc" <- function(self, value) self * value

【讨论】:

  • 谢谢,这有点帮助,我正在寻找可以让我不修改初始功能的东西。我猜它不存在。如果我在周末之前没有得到任何答复。我会检查你的作为解决方案。感谢您的帮助!
  • 它并不漂亮,但你可以编写一个函数来修改它的第一个参数,如下所示:minc &lt;- function(self, x, env = parent.frame()) assign(deparse(substitute(self)), self * x, env); a &lt;- 2; minc(a, 12); print(a)
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 2021-05-02
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2018-03-12
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多