eval(expr,envir,enclos)中的错误:使用eval时找不到对象

时间:2017-09-20 23:05:23

标签: r dplyr data.table eval

我的代码如下:

Form_CharSizePorts2 <- function(main, size, var, wght, ret) {

  main.cln <- main %>% 

    select(date, permno, exchcd, eval(parse(text=size)), eval(parse(text=var)), eval(parse(text=wght)),  eval(parse(text=ret))) %>%
    data.table


  Bkpts.NYSE <- main.cln %>% 
    filter(exchcd == 1) %>% 
    group_by(date) %>%
    summarize(var.P70 = quantile(.[[var]], probs=.7, na.rm=TRUE), 
              var.P30 = quantile(.[[var]], probs=.3, na.rm=TRUE),
              size.Med = quantile(.[[size]], probs=.5, na.rm=TRUE))


  main.rank <- main.cln %>%
    merge(Bkpts.NYSE, by="date", all.x=TRUE) %>%
    mutate(Size = ifelse(.[[size]]<size.Med, "Small", "Big"),
           Var = ifelse(.[[var]]<var.P30, "Low", ifelse(.[[var]]>var.P70, "High", "Neutral")),
           Port = paste(Size, Var, sep="."))

  Ret <- main.rank %>% 
    group_by(date, Port) %>%
    summarize(ret.port = weighted.mean(.[[ret]], .[[wght]], na.rm=TRUE)) %>% 
    spread(Port, ret.port) %>% 
    mutate(Small = (Small.High + Small.Neutral + Small.Low)/3,
           Big = (Big.High + Big.Neutral + Big.Low)/3,
           SMB = Small - Big,
           High = (Small.High + Big.High)/2,
           Low = (Small.Low + Big.Low)/2,
           HML = High - Low)

  return(Ret)
}











Form_FF4Ports <- function(dt) {
  dt.cln <- dt %>% 
    group_by(permno) %>%
    mutate(lag.ret.12t2 = lag(ret.12t2, 1))

  output <- dt.cln %>%
    group_by(date) %>%
    summarize(MyMkt = weighted.mean(retadj.1mn, w=port.weight, na.rm=TRUE)) %>%
    as.data.frame %>%
    merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.BM.FF", "port.weight", "retadj.1mn"),
          by="date", all.x=TRUE) %>% 
    transmute(date, MyMkt, MySMB=SMB, MySMBS=Small, MySMBB=Big, MyHML=HML, MyHMLH=High, MyHMLL=Low) %>%
    merge(Form_CharSizePorts2(dt.cln, "lag.ME.Jun", "lag.ret.12t2", "port.weight", "retadj.1mn"), 
          by="date", all.x=TRUE) %>% 
    transmute(date, MyMkt, MySMB, MySMBS, MySMBB, MyHML, MyHMLH, MyHMLL, MyUMD=HML, MyUMDU=High, MyUMDD=Low)
  return(output)
}




dt.myFF4.m <- Form_FF4Ports(data.both.FF.m) 

我的部分数据如下:

        date permno shrcd exchcd    cfacpr   cfacshr shrout     prc vol retx retadj.1mn       me port.weight datadate
1  Dec 1925  10006    10      1  7.412625  7.260000    600  109.00  NA   NA         NA 65.40000          NA     <NA>
2  Dec 1925  10022    10      1  9.365437  9.365437    200   56.00  NA   NA         NA 11.20000          NA     <NA>
3  Dec 1925  10030    10      1  9.969793  9.155520    156  150.00  NA   NA         NA 23.40000          NA     <NA>
4  Dec 1925  10057    11      1  4.000000  4.000000    500   12.25  NA   NA         NA  6.12500          NA     <NA>
5  Dec 1925  10073    10      1  0.200000  0.200000    138   17.50  NA   NA         NA  2.41500          NA     <NA>
6  Dec 1925  10081    10      1  1.000000  1.000000   1192    9.00  NA   NA         NA 10.72800          NA     <NA>
7  Dec 1925  10102    10      1 18.137865 18.000000    201  109.75  NA   NA         NA 22.05975          NA     <NA>
8  Dec 1925  10110    10      1  1.010000  1.000000    500   10.50  NA   NA         NA  5.25000          NA     <NA>
9  Dec 1925  10129    10      1  1.000000  1.000000    270 -132.00  NA   NA         NA 35.64000          NA     <NA>
10 Dec 1925  10137    11      1 21.842743 20.920870    613   71.75  NA   NA         NA 43.98275          NA     <NA>
   comp.count at revt ib dvc BE OpProf GrProf Cflow Inv AstChg Davis.bkeq d.shares ret.12t2 ME.Dec ME.Jun BM.FF OpIB
1          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
2          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
3          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
4          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
5          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
6          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
7          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
8          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
9          NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
10         NA NA   NA NA  NA NA     NA     NA    NA  NA     NA         NA       NA       NA     NA     NA    NA   NA
   GrIA CFP.FF BM.m CFP.m lag.ME.Jun lag.BM.FF lag.OpIB lag.AstChg
1    NA     NA   NA    NA         NA        NA       NA         NA
2    NA     NA   NA    NA         NA        NA       NA         NA
3    NA     NA   NA    NA         NA        NA       NA         NA
4    NA     NA   NA    NA         NA        NA       NA         NA
5    NA     NA   NA    NA         NA        NA       NA         NA
6    NA     NA   NA    NA         NA        NA       NA         NA
7    NA     NA   NA    NA         NA        NA       NA         NA
8    NA     NA   NA    NA         NA        NA       NA         NA
9    NA     NA   NA    NA         NA        NA       NA         NA
10   NA     NA   NA    NA         NA        NA       NA         NA

当我运行rode时,收到错误消息Error in eval(expr, envir, enclos) : object 'lag.ME.Jun' not found

我想原因可能是我在这里使用了eval(parse(text = ))函数,并且环境设置不正确。但是,除了这个函数之外,我不确定在创建适用于具有不同列名的数据的通用目的函数时应该使用哪种方法。

具体来说,我想知道如何将我的函数用于不同的数据框,而不必在我的函数中使用它们之前更改列名。

1 个答案:

答案 0 :(得分:0)

在dplyr&#39;编程中讨论并解决了您的问题。 vignette

底线不是通过使用lag.ME.Jun引用"lag.ME.Jun"来引用enquo(lag.ME.Jun),而是应该依赖!!lag.ME.Junexchcd。但是,这意味着它应该在函数调用中。

您在其他几个点上的函数也指未在函数环境中创建的变量(例如datep { display: inline; background-color: yellow; box-shadow: 10px 0px 0px red, -10px 0px 0px red; }),因此R当前会在不包含这些变量的任何数据集上抛出错误变量。通常,函数依赖于不属于函数调用的输入是不明智的。