是否将for()函数中打印的值保存为变量?
我对R真的是个新手,我仍在努力学习()函数。我的数据示例dput(MergedData)已链接(我对长度表示歉意;我尝试尽可能缩短它)。我在做一个小项目,我有以下功能:是否将for()函数中打印的值保存为变量?,r,R,我对R真的是个新手,我仍在努力学习()函数。我的数据示例dput(MergedData)已链接(我对长度表示歉意;我尝试尽可能缩短它)。我在做一个小项目,我有以下功能: new.trend <- function(MergedData) { ret <- as.list(rep(NA, length(MergedData))) ma.sig <- ma.crossover(MergedData) pricebreak <- price.channel(Mer
new.trend <- function(MergedData)
{
ret <- as.list(rep(NA, length(MergedData)))
ma.sig <- ma.crossover(MergedData)
pricebreak <- price.channel(MergedData)
sig <- intersect(which((ma.sig[1,])==1), which(!pricebreak[1,]==0))
for (i in sig) { #Calculates output variables based on active signals
x <- MergedData[[i]]
x <- xts(x[,-1], order.by=x[,1])
dev20 <- (x[,4]-SMA(x[,4], n=20))/x[,4]*100
dev50 <- (x[,4]-SMA(x[,4], n=50))/x[,4]*100
RSI <- RSI(x[,4], n=14)
ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L)))
}
na.omit(print(ret))
}
print(new.trend(MergedData))
但是我想检索在for()函数中打印的内容,例如:
> for (i in sig) { #Calculates output variables based on active signals
+ x <- MergedData[[i]]
+ x <- xts(x[,-1], order.by=x[,1])
+ dev20 <- (x[,4]-SMA(x[,4], n=20))/x[,4]*100
+ dev50 <- (x[,4]-SMA(x[,4], n=50))/x[,4]*100
+ RSI <- RSI(x[,4], n=14)
+ print(ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L))))
+ }- (x[,4]-SMA(x[,4], n=50))/x[,4]*100
RSI <- RSI(x[,4], n=14)
print(ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L))))
}
EUR.LAST EUR.LAST.1 EMA
2017-02-09 -0.6968559 0.3526983 44.68176
GBP.LAST GBP.LAST.1 EMA
2017-02-09 -0.1920461 1.027927 52.27664
CHF.OPEN CHF.OPEN.1 EMA
2017-02-09 0.5066387 -0.7241689 52.56533
PLN.CLOSE PLN.CLOSE.1 EMA
2017-02-09 0.2824105 -1.569392 48.24069
TRY.CLOSE TRY.CLOSE.1 EMA
2017-02-09 -2.315328 -0.2501765 42.52731
ZAR.CLOSE ZAR.CLOSE.1 EMA
2017-02-09 -0.09598239 -1.492148 46.06286
CLP.CLOSE CLP.CLOSE.1 EMA
2017-02-09 -0.2433194 -2.112368 40.93616
MXN.CLOSE MXN.CLOSE.1 EMA
2017-02-09 -2.460443 -3.490762 34.67792
PEN.CLOSE PEN.CLOSE.1 EMA
2017-02-09 -0.4138617 -1.974541 37.84737
CNY.CLOSE CNY.CLOSE.1 EMA
2017-02-09 -0.08749199 -0.5004658 44.39283
IDR.CLOSE IDR.CLOSE.1 EMA
2017-02-09 -0.4064827 -0.631571 35.91677
INR.CLOSE INR.CLOSE.1 EMA
2017-02-09 -1.291429 -1.594705 21.83156
KRW.CLOSE KRW.CLOSE.1 EMA
2017-02-09 -0.8529425 -2.840274 34.61214
MYR.CLOSE MYR.CLOSE.1 EMA
2017-02-09 0.1407816 -0.4020273 49.80231
SGD.CLOSE SGD.CLOSE.1 EMA
2017-02-09 0.123548 -0.7103133 49.73621
PHP.CLOSE PHP.CLOSE.1 EMA
2017-02-09 0.1355443 0.236601 55.61772
THB.CLOSE THB.CLOSE.1 EMA
2017-02-09 -0.518655 -1.396926 23.51997
>for(i in sig){#根据活动信号计算输出变量
+好的,现在我明白了。如果你想保持循环,你可以改变:
na.omit(print(ret))
到
尝试使用apply函数计算数据帧或时间序列。
在R中,最好避免像ret#create zoo object这样的构造
>z z
第1栏第2栏
2017-01-01 1 5
2017-01-02 2 6
2017-01-03 3 7
>#创建计算每行的函数
>f#将函数f应用于zoo(z)对象的每一行(边距=1),转置矩阵并创建zoo时间序列
>res%t%>%as.zoo(,order.by=rownames()
>res
第1栏第2栏
2017-01-01 1 25
2017-01-02 4 36
2017-01-03 9 49
>类(res)
[1] “动物园”
>
谢谢你的建议,但由于某些原因,我仍然得到与na相同的结果。省略(print(ret))我真的很感谢第二次尝试:),但它给了我“在[.xts
(x,!is.na(x))中的错误:'I'或'j'超出范围”。我还尝试了na.omit(do.call(ret,merge)),但它返回了一个空矩阵。嗯……我试图用dget加载数据,但R失败。你能转储dput中的数据吗?@kwicher抱歉,删除了以前的评论,因为我认为这样更容易为你提供实际数据和我用于在R中编制索引的代码。这是原始数据,这是正确组织它的函数:抱歉,但这是ngs不在一起玩…你在提供的数据/代码中缺少了一些东西。你真的必须创建一个最小的完整示例,将错误重新创建为独立脚本谢谢你!我正在努力成为一个更好的R程序员,所以风格指针非常受欢迎:)。有什么原因使apply比ret’apply更受青睐吗'允许您管理数组索引,它使您的代码简洁明了。您将避免常见数组中出现的许多错误。'for'在apply内部可以循环,但在R中,向量化解决方案更优雅,这是为了节省您的时间。请尝试在R中使用向量而不是循环。请注意,这不会使用dplyr中的任何内容,除了%>%代码>和从magrittr导入的代码,因此库(dplyr)
可以替换为库(magrittr)
,以最小化依赖关系。
na.omit(print(ret))
lapply(ret, function(x) x[!is.na(x)])
library(dplyr)
library(zoo)
#create zoo object
z <- zoo(data.frame(column1 = c(1, 2, 3), column2 = c(5, 6, 7)), order.by = seq(from = as.Date('2017-01-01'), by = 'day', length.out = 3))
z
#create function to calculate each row
f <- function(row){
row ^ 2
}
#apply function f to each row (MARGIN = 1) of zoo (z) object, transpose matrix and create zoo time series
res<-apply(z,MARGIN = 1,function (row) f(row)) %>% t %>% as.zoo(.,order.by=rownames(.))
res
class(res)
> library(dplyr)
> library(zoo)
> #create zoo object
> z <- zoo(data.frame(column1 = c(1, 2, 3), column2 = c(5, 6, 7)), order.by = seq(from = as.Date('2017-01-01'), by = 'day', length.out = 3))
> z
column1 column2
2017-01-01 1 5
2017-01-02 2 6
2017-01-03 3 7
> #create function to calculate each row
> f <- function(row){
+ row ^ 2
+ }
> #apply function f to each row (MARGIN = 1) of zoo (z) object, transpose matrix and create zoo time series
> res<-apply(z,MARGIN = 1,function (row) f(row)) %>% t %>% as.zoo(.,order.by=rownames(.))
> res
column1 column2
2017-01-01 1 25
2017-01-02 4 36
2017-01-03 9 49
> class(res)
[1] "zoo"
>