为什么是parent.frame(5)?

时间:2018-02-27 17:31:19

标签: r environment

任何人都可以帮我计算相框吗? 我有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))

1 个答案:

答案 0 :(得分:1)

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

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

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