2017-09-20 184 views
0
时找不到对象

我的代码如下:错误的eval(表达式,ENVIR,enclos):使用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 

当我跑步,我得到了错误信息Error in eval(expr, envir, enclos) : object 'lag.ME.Jun' not found

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

具体而言,我想知道如何在不使用数据框的情况下使用我的函数,而不必在我的函数中使用它们之前更改列名称。

回答

0

在'用dplyr编程'vignette中讨论并解决了您的问题。

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

您在其他几个点的功能也是指不在功能环境中创建的变量(例如exchcddate),因此R当前将在任何不包含这些变量的数据集上抛出错误。通常,函数依赖于不属于函数调用的输入是不明智的。

+0

我想出了这个问题。非常感谢 – BOBO

相关问题