我正在尝试为我创建的自定义类重载下标运算符("["
)。我想弄清楚如何处理以下问题。
a[x] = foo
vs foo = a[x]
foo = a[,x]
如何识别第一个参数?编辑:我的第一点已收到多个答案。在这个过程中,我找到了第二个问题的答案。您可以使用“缺失”功能来确定存在哪些参数。
以下是示例代码:
setMethod("[", signature(x="myClass"),
function(x, i, j, k, l) {
if (missing(i)) { i = 0 }
if (missing(j)) { j = 0 }
if (missing(k)) { k = 0 }
if (missing(l)) { l = 0 }
})
我接受了这个问题的答案,因为第3点对我来说是最不重要的。
答案 0 :(得分:9)
发现Generic,以便了解您的目标:
getGeneric('[')
# standardGeneric for "[" defined from package "base"
# function (x, i, j, ..., drop = TRUE)
并且:
getGeneric('[<-')
# standardGeneric for "[<-" defined from package "base"
# function (x, i, j, ..., value)
然后你实现它,例如:
`[<-.foo` <-
function(x, i, j, value)
{
....
}
答案 1 :(得分:6)
对于第一个项目符号点,有两个要重载的函数:
[
[<-
第一个函数返回值,第二个函数设置值。请参阅Extract.data.frame{base}
答案 2 :(得分:5)
以[.data.frame
的来源为例。你已经按顺序获得了x,i和j。
> `[.data.frame`
function (x, i, j, ..... )
> `[<-.data.frame`
function (x, i, j, value)
你可以做类似的事情:
obj <- structure(runif(10),class="myclass")
`[.myclass` <- function(x,i=NULL,j=NULL) {
message("First parameter is ", i, "\n")
message("Second parameter is ", j, "\n")
sum(x)
}
obj[c(1,2,3)]
`[<-.myclass` <- function(x,i=NULL,j=NULL,value) {
res <- unclass(x)
res[i] <- value
res
}
obj[1] <- 1
订单无关紧要。我和j将是正确的:
2 -> obj[2]
> obj
[1] 1.0000000 2.0000000 0.3466835 0.3337749 0.4763512 0.8921983 0.8643395 0.3899895 0.7773207 0.9606180
答案 3 :(得分:1)
至于第三个要点,你可以使用这样的东西:
seq_parse <- function(s) {
the_s <- deparse(substitute(s))
env <- new.env()
assign("seq", function(...) return(list(...)), envir=env)
seq_params <- try(eval(parse(text=the_s), envir=env), silent=TRUE)
if(!inherits(seq_params, "try-error")) {
cat("parsing successful \n")
return(seq_params)
} else {
stop("Failed to parse.")
}
}
此函数将参数返回到seq
,
> seq_parse(seq(from=1,to=10,by=0.5))
working with params to seq_params
$from
[1] 1
$to
[1] 10
$by
[1] 0.5
或传统的评估论证,
> seq_parse(1:5)
parsing successful
[1] 1 2 3 4 5
但是,我不确定这是不是很好的做法。此外,您必须仔细解释seq
的参数,它们可以是未命名的,而不是to
可能有length.out
等。