用R进行方法链接
有可能在R中链接函数吗 样本数据:用R进行方法链接,r,method-chaining,R,Method Chaining,有可能在R中链接函数吗 样本数据: m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2) 我怎样才能解决这个问题 编辑2 添加一个示例 require(xts) require(PerformanceAnalytics) xts.ts <- xts(rnorm(231),as.Date(13514:13744,origin="1970-01-01")) plot(na.omit(lag( rollapply(xts.ts, width=r
m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2)
我怎样才能解决这个问题
编辑2
添加一个示例
require(xts)
require(PerformanceAnalytics)
xts.ts <- xts(rnorm(231),as.Date(13514:13744,origin="1970-01-01"))
plot(na.omit(lag( rollapply(xts.ts, width=rolling.per-1, FUN= function(x){sqrt(var(x))*sqrt(252)}), k=1)), main = "Dummy Example")
require(xts)
要求(性能分析)
有点,但我认为这不是惯用语,可能很脆弱/不是个好主意。(我认为@RichieCotton的上述评论暗示了这一点。)
发件人:
10.3.4特殊操作人员
R允许用户定义的中缀运算符。它们的形式是由“%”字符分隔的字符串。绳子可以
包含除“%”以外的任何可打印字符。逃逸序列
字符串在这里不适用
请注意,以下运算符是预定义的
%% %*% %/% %in% %o% %x%
注:
- 你的例子有点可笑,因为
mean(x)
总是返回一个标量(即长度为1的向量),所以sum(mean(x))
总是与mean(x)
- 中缀运算符必须由
%
包围,因此不能有任何像单个符号那样紧凑的东西(而且已经采用了%
)
- 这种链接是非关联的,这让我担心——上面的例子似乎有效,所以R(显然)是从左到右计算的,但我不知道这是肯定的
编辑:现在的问题是如何合并其他参数。我不认为建议的语法(x%@%fun1(arg1)%@%fun2(arg2)
)如果没有一些真正的魔力就可以工作。这是目前我能得到的最接近的结果——创建一个包装器函数,创建原始函数的修改版本
F <- function(f,...) {
function(x) {
f(x,...)
}
}
F尝试功能包:
library(functional)
squared <- function(x)x*x
Compose(sum, squared)(m)
## [1] 44100
squared(sum(m))
## [1] 44100
addn <- function(n, x) x + n
Compose(Curry(addn, 1), squared)(10)
## [1] 121
squared(addn(1, 10))
## [1] 121
编辑2:
关于调试的问题,debug
如果函数是curry,则可以工作。如果它还没有咖喱,那么用咖喱把它包起来:
# this works since addn is curried
debug(addn)
Compose(Curry(addn, 1), squared)(10)
# to debug squared put it in a Curry -- so this works:
debug(squared)
Compose(Curry(addn, 1), Curry(squared))(10)
与本的回答类似,但允许争论:
`%@%` <- function(x, f) eval.parent(as.call(append(as.list(substitute(f)), list(x), 1)))
x %@% mean %@% sqr # => 6.25
c(1, 2, NA, 3, 4) %@% mean(na.rm=T) %@% sqr # => 6.25
m %@% colMeans() %@% sum() # => 21
`%@%`6.25
c(1,2,NA,3,4)%@%平均值(NA.rm=T)%@%sqr#=>6.25
m%@%colMeans()%@%sum()#=>21
我会使用magrittr
包。它有一个“管道”操作符,该操作符接受一个函数的结果并将其作为参数传递给下一个函数:
m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2)
m %>% mean %>% sum
m%平均值%>%sum
塞西,这是烟斗 res没有什么错,但是取长度为1的向量的和(这是由矩阵上的mean
返回的)没有多大意义。虽然它“很快”就会消失,但仍然有一个mean.data.frame
函数返回向量。它有很多函数和参数,我发现IMO方法链接可以提高可读性并减少源代码的数量,这一点很重要。但是你是对的,res-FYI没有错。这种编程风格被称为无点编程(或者有时是无意义的!)。有几个注意事项,它似乎是一个工作周围,但它可能只是做的把戏很好!您建议如何修改%@%运算符以便我可以添加参数?例如:m%@%function1(arg1,arg2)%function2(arg1,arg2)与“%@%”Sam有什么关系,你能给我一个具体的例子说明你想做什么以及它应该产生什么结果吗?由于function1(arg1,arg2)
通常不是函数,因此您的语法无法完全按照编写的语法工作。我认为@Henrik的想法可能行不通,因为我们必须小心保持论点的正确顺序f
应该是第二个参数,以便以正确的从左到右的顺序执行操作…@Henrik我无法使用您的函数,有些事情我不明白。@Ben:参数顺序可能有问题。我将编辑我的问题以添加一个示例。我认为gsubfn包可以做类似的事情,至少是env@fn?@DWin,说得好。在gsubfn中,我们可以这样做:Compose(fn$identity(~addn(1,x)),squared)(10)
。当然,即使没有gsubfn,我们也可以这样做:Compose(function(x)addn(1,x),squared)(10)
@G.Grothendieck,它可以工作,但我认为它并没有像其他面向对象语言那样为您提供fluent interface()的通常优势。此外,我相信,如果函数是在Curry
中,那么要去除station的一部分bug并不容易。@Sam,debug
可以工作。请参见EDIT 2
。要使用最后一个,您需要使用名称中的任何一个,我以前从未见过这样的名称。它非常聪明。我非常害怕在生产代码中使用它,因为它可能很脆弱……我不想在代码生产或其他方面使用它!不管这是不是一个好主意,我喜欢R的地方是这种事情是可能的。我可以看出,对于习惯了普通OOobject.verb()
而不是R的动词(object)
的人来说,它看起来会更熟悉。
"%@%" <- function(x,f) {
f(x)
}
sqr <- function(x) x^2
x <- 1:4
x %@% mean ## 2.5
x %@% mean %@% sqr ## 6.25
x %@% (mean %@% sqr) ## fails
m %@% colMeans %@% sum ## 21
F <- function(f,...) {
function(x) {
f(x,...)
}
}
pow <- function(x,b=2) { x^b }
sqr <- function(x) x^2
x <- 1:4
x %@% F(mean,na.rm=TRUE) ## 2.5
x %@% F(mean,na.rm=TRUE) %@% F(pow,3) ## 16.25
library(functional)
squared <- function(x)x*x
Compose(sum, squared)(m)
## [1] 44100
squared(sum(m))
## [1] 44100
addn <- function(n, x) x + n
Compose(Curry(addn, 1), squared)(10)
## [1] 121
squared(addn(1, 10))
## [1] 121
# this works since addn is curried
debug(addn)
Compose(Curry(addn, 1), squared)(10)
# to debug squared put it in a Curry -- so this works:
debug(squared)
Compose(Curry(addn, 1), Curry(squared))(10)
`%@%` <- function(x, f) eval.parent(as.call(append(as.list(substitute(f)), list(x), 1)))
x %@% mean %@% sqr # => 6.25
c(1, 2, NA, 3, 4) %@% mean(na.rm=T) %@% sqr # => 6.25
m %@% colMeans() %@% sum() # => 21
m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2)
m %>% mean %>% sum