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来简化。
我想我返回一个命名列表是好的,因为列表可以存储不同类型的元素。有没有其他方法可以编写我的函数返回?我想明确的和节省时间的!
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)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)内另一种可能性是使用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)多个 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)