从函数调用返回具有各种元素的命名列表

Tra*_*vis 1 r return function apply

我有一个这样的功能:

myfunc <- function(x){

    a1 = 1
    a2 = c(2,4)
    a3 = data.frame(x = 1:10)
    ...
    an = 'str'
    res = list(a1 = a1,a2 = a2,..., an=an)
    return(res)
}

Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,我返回带有命名列表的结果。但是,如果元素数量很大,我无法a_i = a_i一一键入。我使用下面的代码片段来节省一半的时间(但我仍然需要输入"元素的名称,这是浪费时间):

res_short = sapply(c('a1','a2',...,'an'),FUN = function(x){list(get(x))})
return(res_short)
Run Code Online (Sandbox Code Playgroud)

请注意,我的元素名称中可能不存在模式a1,a2,...,an,我只是使用a1, a2...an来简化。

我想我返回一个命名列表是好的,因为列表可以存储不同类型的元素。有没有其他方法可以编写我的函数返回?我想明确的节省时间的

G. *_*eck 5

  1. mget使用mget如下图。要返回所有变量 usemget(ls())或返回除xuse之外的所有变量mget(setdiff(ls(), "x"))ls除非使用all参数,否则不会返回以点开头的对象名称,即ls(all = TRUE),可用于防止返回某些变量。另一种可能性是使用 的mode=参数mget将返回的对象限制为numeric,例如。见?mget。另一种限制返回对象的方法是Filter在 的结果上使用mget。例如,res <- Filter(is.data.frame, mget(ls()))只返回数据帧。

    myfunc <- function(x){
        a1 = 1
        a2 = c(2,4)
        a3 = data.frame(x = 1:10)
        an = 'str'
        res = mget(ls(pattern = "^a"))
        return(res)
    }
    myfunc(3) # test
    
    Run Code Online (Sandbox Code Playgroud)
  2. environment另一种可能性是在执行函数中返回环境。函数中的所有对象(不仅仅是以 开头的对象a)都将在环境中。

    myfunc2 <- function(x) {
        a1 = 1
        a2 = c(2,4)
        a3 = data.frame(x = 1:10)
        an = 'str'
        res = environment()
        return(res)
    }
    out <- myfunc2(3) # test
    out$a
    
    Run Code Online (Sandbox Code Playgroud)
  3. 另一种可能性是使用within。仅返回在内部创建的变量。x在 中使用within但未在 中创建,within因此不会返回。

    myfunc3 <- function(x) {
      res <- within(list(), {
       a1 <- x
       a2 <- BOD
      })
      return(res)
    }
    myfunc3(3) # test
    
    Run Code Online (Sandbox Code Playgroud)
  4. 多个 lsls()在创建要输出的变量的部分之前和之后 执行一个之前和之后mget的差异。

    myfunc4 <- function(x) {
      .excl <- ls()
      a1 <- x
      a2 <- BOD
      res <- mget(setdiff(ls(), .excl))
      return(res)
    }
    myfunc4(3) # test
    
    Run Code Online (Sandbox Code Playgroud)