【问题标题】:Write functions for methods in Rstudio为 Rstudio 中的方法编写函数
【发布时间】:2019-04-20 04:22:13
【问题描述】:

我想寻求您的帮助。事实上,我目前正在尝试创建一个包来模拟滚动对象并创建函数来这样做。更准确地说,我创建了 roll 函数,它接受一个设备的参数以及滚动设备的次数。

roll <- function(device=device(), times=1 ) {
  if (class(device) != "device") {
    stop("the object must be of class device")
  }
  check_times(x=times)
  rolls <-  sample(device$sides, size=times,
                   replace= TRUE, prob= device$prob)
  obj <- list(rolls= rolls, sides = device$sides,
              prob= device$prob, total= times)
  class(obj) <- "rolls"
  print.rolls(obj)
}

我实际上想创建一个提取函数,如果我这样做了

             object <- roll(die, times = 100)
             oject[10]

我得到了第 10 卷。

此外,我还想要一个可以让我替换给定卷的功能。说“

        object <- roll(two_side_die, times = 100)
        object[10] <- "head"

用头替换第 10 卷。

最后,一个能得到的加法方法

        roll(die, times= 300) 

通过做例子

          roll(die, times = 100) + 200

非常感谢!!

【问题讨论】:

  • 编写函数`[.rolls` &lt;- function(obj, ind) {...}`[.rolls&lt;-` &lt;- function(obj, ind, newval) {...}(有意使用嵌入的反引号)。函数中的 obj 将是问题中的 objectind 将是 10,newval 将是 "head"。从那里开始,您应该能够按照您的预期进行操作。只需确保这些函数返回新对象即可。为了好玩,您还可以重载print.rolls &lt;- function(x, ...) {...},如果您希望它在控制台上以特定方式显示。
  • 您好,非常感谢!您是否有机会提供一个链接,我可以在其中找到有关[.rolls 写作结构的更多解释。它实际上适用于第一个括号函数,但不适用于数组函数。当我写的时候,[.rolls&lt;- &lt;- function(x, ind, z) { x$rolls[ind] &lt;- 'z' } 它没有考虑到变化。 (我使用了嵌入的反引号)
  • 来自我之前的评论:“只要确保这些函数返回新对象”。你不是。如果您查看x$rolls[ind] &lt;- 'z' 时实际返回的内容,问题就很明显了。该赋值操作的返回值就是被赋值的值,即'z'。如果你改为使用{ x$rolls[ind] &lt;- 'z'; x;},你应该得到你想要的。
  • 看我的回答...我把函数名的部分颠倒了,对不起。
  • 可能还早,但由于您是新来的,这也适用于您的某些previous questions:如果答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r function package extension-methods


【解决方案1】:

由于您已经在使用class(obj) &lt;- "class" 的一些 S3 方法调度,您应该能够做到:

`[.rolls` <- function(obj, ind) obj$rolls[ind]
`[<-.rolls` <- function(obj, ind, value) { obj[["rolls"]][ind] <- value; obj; }

一些假数据:

foo <- list(rolls=10L+1:5, sides=6, probs = 1/6)
class(foo) <- "rolls"
foo[3]
# [1] 13
foo[3] <- 99L
foo
# $rolls
# [1] 11 12 99 14 15
# $sides
# [1] 6
# $probs
# [1] 0.1666667
# attr(,"class")
# [1] "rolls"

您可以对对象进行漂亮的打印,尽管它仅具有交互用途:

print.rolls <- function(x, ...) {
  cat("<Rolls>\n")
  cat("  len: ", length(x[["rolls"]]), "\n")
  cat("  other properties: ", paste(sort(setdiff(names(x), "rolls")), collapse = ", "), "\n")
}
foo
# <Rolls>
#   len:  5 
#   other properties:  probs, sides 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多