代码之家  ›  专栏  ›  技术社区  ›  BOBO

eval(expr、envir、enclose)中出错:使用eval时未找到对象

  •  0
  • BOBO  · 技术社区  · 7 年前

    我的代码如下:

    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 = ))

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   M.M. Middeldorp    7 年前

    在“使用dplyr编程”中讨论并解决了您的问题 vignette .

    底线不是引用 lag.ME.Jun "lag.ME.Jun" ,你应该依靠 enquo(lag.ME.Jun) !!lag.ME.Jun

    在其他几个点上,您的函数还引用了未在函数环境中创建的变量(例如。 exchcd , date