R循环中的NA / NAN参数错误

时间:2017-04-27 16:30:24

标签: r for-loop lapply

我是R的新人,我想得到一些帮助。我有一个带有用户定义函数的R代码,名为Plot_linear_fit,我运行时没有任何错误。

 ReportDateRange <- c("2010-11-01", "2017-01-31")
 trendDateRange1 <- c("2015-01-01", "2015-08-31")
 trendDateRange2 <- c("2015-01-01", "2016-10-31")
 trendDateRange3 <- c("2015-01-01", "2016-06-30")
 plotDate1 <- c("2011-01-01")
 plotDate2 <- c("2015-01-01")
 plotDate3 <- c("2013-01-01")
 numoftrends <- 3

 TRx.Plot1 <- Plot_linear_fit(Sum.TRx,
                              trendDateRange1,
                              plotDate1, 
                              ReportDateRange)

 TRx.Plot2 <- Plot_linear_fit(Sum.TRx,
                              trendDateRange2,
                              plotDate2, 
                              ReportDateRange)

 TRx.Plot3 <- Plot_linear_fit(Sum.TRx,
                              trendDateRange3,
                              plotDate3, 
                              ReportDateRange)

我想使用lapply将这些代码放在循环中,但是当我尝试运行它时,我得到了NA / NAN参数

 ReportDateRange <- c("2010-11-01", "2017-01-31")
 trendDateRange1 <- c("2015-01-01", "2015-08-31")
 trendDateRange2 <- c("2015-01-01", "2016-10-31")
 trendDateRange3 <- c("2015-01-01", "2016-06-30")
 plotDate1 <- c("2011-01-01")
 plotDate2 <- c("2015-01-01")
 plotDate3 <- c("2013-01-01")
 numoftrends <- 3

 lapply(1:numoftrends, function(j) {
    paste0('TRx.Plot', j) <- Plot_linear_fit(Sum.TRx,
                                 paste0("trendDateRange", j),
                                 paste0("plotDate", j),
                                 ReportDateRange)

     })

当你把它放在lapply中时,我不太确定是什么问题。函数Plot_linear_fit的输出是数据帧。谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

最小的解决方案是(我猜测,未经测试的代码,因为你没有提供MRE):

lapply(1:numoftrends, function(j) {
  assign(paste0('TRx.Plot', j),
         Plot_linear_fit(Sum.TRx,
                         get(paste0("trendDateRange", j)),
                         get(paste0("plotDate", j)),
                         ReportDateRange),
         pos = .GlobalEnv)
})

但是,完全放弃全局工作空间中的作业并直接使用列表会更加惯用:

list_of_plots <- lapply(1:numoftrends, function(j) {
  Plot_linear_fit(Sum.TRx,
                  get(paste0("trendDateRange", j)),
                  get(paste0("plotDate", j)),
                  ReportDateRange)
})