在回答另一个问题时,@ Mayk发布了以下解决方案:https://stackoverflow.com/a/10432263/636656
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")
`levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
哪个产生输出:
[1] Generic Generic Bayer Bayer Advil Tylenol Generic Advil Bayer Generic Advil Generic Advil Tylenol
[15] Generic Bayer Generic Advil Bayer Bayer
Run Code Online (Sandbox Code Playgroud)
这只是矢量的打印输出,所以要存储它你可以做得更加困惑:
res <- `levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
显然这是对level函数的某种调用,但我不知道这里做了什么.这种巫术的术语是什么,我如何在这个领域增加我的魔法能力?
我遇到了这篇文章:来自Matt Dowle的http://r.789695.n4.nabble.com/speeding-up-perception-tp3640920p3646694.html,早些时候讨论过一些问题?data.table包的实施思路.
他使用以下代码:
x = list(a = 1:10000, b = 1:10000)
class(x) = "newclass"
"[<-.newclass" = function(x,i,j,value) x # i.e. do nothing
tracemem(x)
x[1, 2] = 42L
Run Code Online (Sandbox Code Playgroud)
具体来说,我在看:
"[<-.newclass" = function(x,i,j,value) x
Run Code Online (Sandbox Code Playgroud)
我试图了解那里做了什么以及如何使用这种表示法.
它看起来像我:
因此,我最好的猜测是我为现场修改定义了一个自定义函数(对于给定的类).
[<-.newclass 是类newclass的类修改.
了解发生的情况:通常以下代码应返回错误:
x = list(a = 1:10000, b = 1:10000)
x[1, 2] = 42L
Run Code Online (Sandbox Code Playgroud)
所以我想示例代码没有任何实际用途.
尝试使用逻辑:
一个简单的无意义尝试就是将要插入的值平方:
x[i, j] <- value^2
Run Code Online (Sandbox Code Playgroud)
全面尝试:
> x = matrix(1:9, 3, 3)
> class(x) = "newclass"
> "[<-.newclass" = function(x, …Run Code Online (Sandbox Code Playgroud) 是否有可能获得语法
foo$bar(x) <- value
Run Code Online (Sandbox Code Playgroud)
工作在哪里foo是一个引用类对象,bar是一个方法?即是可以做"子集分配"并将"替换函数"作为参考类中的方法吗?
是否可以使用其他OO系统获得语法?
示例:
我将用一个用例说明.想象一个引用类,Person它包含一个人的一些基本信息.特别是,一个叫做的字段fullname名为list:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
Run Code Online (Sandbox Code Playgroud)
接下来,我们应该定义一些方法来获取和设置fullnames列表中的特定名称(尝试)给出上面的语法/接口.到目前为止,我最好的尝试是:
PersonRCGen$methods(
name = function(x) { # x is the dataset,
.self$fullname[[x]]
},
`name<-` = function(x, value) {
.self$fullname[[x]] <- value
}
)
Run Code Online (Sandbox Code Playgroud)
这里的命名也应该说明我正在尝试做什么.
我们初始化一个新对象:
a_person <- PersonRCGen$new(fullname = list(first = "Jane", last = "Doe"),
gender = "F")
Run Code Online (Sandbox Code Playgroud)
fullname直接访问字段并通过定义的get函数访问名字和姓氏按预期工作:
a_person$fullname
#$`first`
#[1] "Jane"
#
#$last
#[1] …Run Code Online (Sandbox Code Playgroud) 我对使用它感到困惑setReplaceMethod().看着?setReplaceMethod没有提供解释,谷歌搜索不是很有帮助.
问题:请解释setReplaceMethod(),它的用法及其工作原理(最好以一个例子为准).
我试图在 R(例如,a, *b, c = [1,2,3], "C")中使 Python 3 样式的赋值解包成为可能,尽管我非常接近(您可以在此处查看我的代码),但我最终还是遇到了一些(奇怪的)问题。
我的代码是这样工作的:
a %,*% b %,% c <- c(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
并将分配a= 1、b=c(2,3,4)和c= 5(我的代码实际上确实做到了这一点,但有一个小问题我稍后会讲到)。
为了让它做任何事情,我必须定义:
`%,%` <- function(lhs, rhs) {
...
}
Run Code Online (Sandbox Code Playgroud)
和
`%,%<-` <- function(lhs, rhs, value) {
...
}
Run Code Online (Sandbox Code Playgroud)
(以及%,*%和%,*%<-,它们是先前函数的轻微变体)。
*tmp*的lhs参数据我所知,R 首先从左到右评估这段代码(即,从a到c,直到它到达最后一个%,%,然后,它从右到左返回,沿途分配值。但是第一个我注意到的奇怪的事情是,当我做match.call()或substitute(lhs)在类似的事情中x %infix% …
我只是在R中弄湿了,并且惊讶地看到一个函数没有修改一个对象,至少它似乎是默认的.例如,我写了一个函数只是为了在表中的一个标签上粘贴一个星号; 它在函数内部工作,但表本身不会更改.(我主要来自Ruby)
那么,使用函数来改变R中对象的正常,可接受的方式是什么?如何在表格标题中添加星号?
通过"替换函数"我的意思是在这个线程中提到的什么是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)
其他一些名字很好地工作也是如此,如果它们类似于x和 …
我正在尝试重命名列而不创建对象(数据帧).
当我跑:
names(data.frame(cbind(LETTERS[1:3],1:3)))[1]<-"A"
Run Code Online (Sandbox Code Playgroud)
我明白了:
Error in names(data.frame(cbind(LETTERS[1:3], 1:3)))[1] <- "A" : could not find function "data.frame<-"
Run Code Online (Sandbox Code Playgroud)
如果我跑:
X<-data.frame(cbind(LETTERS[1:3],1:3))
colnames(X)[1]<-"letters"
X
Run Code Online (Sandbox Code Playgroud)
我会看到列名更改,因为我创建了一个数据框然后更改了它.我很确定除了对象创建之外,这两个代码片段是相同的.我不知道R是否只是在这个功能上不灵活,我必须有时创建对象而不是其他对象.但错误"......找不到功能"对我来说似乎有些奇怪.有人可以解释这个错误吗?
这可能是一个愚蠢的问题,但我已经困扰了很长一段时间.我看到人们在定义函数时使用单引号括起函数名.我一直在想这样做的好处.以下是一个天真的例子
'row.mean' <- function(mat){
return(apply(mat, 1, mean))
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我如何提取所有<-在单词末尾或介于两者之间带有符号“ ”的单词,但在后一种情况下,仅当“ <-”符号后跟一个点时。
把它放在上下文中。练习 6.5.3 的哈德利Wickhams -预研 要求读者列出基本包所有替代函数。
只有一种方法的替换函数由<-
函数名称末尾的符号表示。但是,泛型函数的方法名称附加到替换形式的名称(带一个点),这样<-不再位于函数名称的末尾。例子split<-.data.frame
编辑:
obj <- mget(ls("package:base"), inherits = TRUE)
funs <- Filter(is.function, objs)
Run Code Online (Sandbox Code Playgroud)
这就是您提取基础包中所有功能的方式。现在我只想找到替换功能。