为什么 parent.frame(5)?

Why parent.frame(5)?

谁能帮我算帧数?
我有 load 函数的快捷方式:

loa=function(x,dir='./dados/') { 
      if(right(dir,1) != '/') dir=paste0(dir,'/')
      tryCatch(load(paste0(dir,gsub('\"','',deparse(substitute(x))),'.rda'),envir = parent.frame(1))
       ,error= function(e) print(e)
       ,warning= function(e)
         load(paste0(dir,x,'.rda'),envir = parent.frame(5))
       )
}

在其中,可以放置不带引号的变量名、带引号的变量名或带名称的变量。例如,loa(VALE3)loa('VALE3')var_name='VALE3'; loa(var_name) 有效。
为了让它工作,我不得不把 parent.frame(5) - 从 1 到 4 不工作。我可以数 .GlobalEnvloa 帧、tryCatch 帧,甚至 warning 帧。
其他框架是什么?

P.S。

right=function(x, n)  
   if(n>0) substr(x, (nchar(x)-n+1), nchar(x)) else substr(x, 1, (nchar(x)+n))

与其使用相对父帧,不如直接捕获帧作为函数的开始,然后直接传递它。 (您无法控制运行时创建的帧数 tryCatch)。

虽然我认为允许字符串或符号名称实际上只是一个危险的混乱,但 R 确实允许。您可以检查传递给函数的承诺的类型,如果它不是字符串,则对其进行解析。最好有两个不同的参数。如果你想传递一个符号,一个,如果你想传递一个字符,另一个。

loa <- function(x, dir='./dados/') { 
      toenv <- parent.frame()
      xn <- substitute(x)
      if (!is.character(xn)) xn <- deparse(xn)
      if (right(dir,1) != '/') dir <- paste0(dir, '/')
      path <- paste0(dir,gsub('\"', '', xn), '.rda')
      tryCatch(load(path, envir = toenv), 
          error = function(e) print(e)
      )
}