我需要访问lapply函数中的列表名称.我在网上发现了一些线程,据说我应该遍历列表的名称,以便能够获取我的函数中的每个列表元素名称:
> n = names(mylist)
> mynewlist = lapply(n, function(nameindex, mylist) { return(mylist[[nameindex]]) }, mylist)
> names(mynewlist)
NULL
> names(mynewlist) = n
Run Code Online (Sandbox Code Playgroud)
问题是mynewlist丢失了原始的mylist索引,我必须添加last names()赋值来恢复它们.
有没有办法为lapply函数返回的每个元素提供显式索引名称?或者以不同的方式确保mynewlist元素具有正确的索引名称集?如果lapply没有以与mylist相同的顺序返回列表元素,我觉得mynewlist索引名称可能是错误的.
我想使用一个使用标准deparse(substitute(x))技巧的函数lapply.不幸的是,我只是得到了循环的论证.这是我完全没用的可重复的例子:
# some test data
a <- 5
b <- 6
li <- list(a1=a,b2=b)
# my test function
tf <- function(obj){
nm <- deparse(substitute(obj))
res <- list(myName=nm)
res
}
tf(a)
#returns
$myName
[1] "a"
Run Code Online (Sandbox Code Playgroud)
这很好.如果我使用lapply我得到[[1L]]或x匿名函数的参数.
lapply(li,function(x) tf(x))
# returns
$a1
$a1$myName
[1] "x"
$b2
$b2$myName
[1] "x"
Run Code Online (Sandbox Code Playgroud)
有没有办法获得以下?
$a1
$a1$myName
[1] "a1"
$b2
$b2$myName
[1] "b1"
Run Code Online (Sandbox Code Playgroud)
如果有更一般的东西deparse(substitute(x)),lapply我也渴望知道.
编辑:问题,而不是使用接受多个参数的匿名函数,因此可以使用对象的名称和对象本身不起作用,因为该tf函数只接受一个参数.所以这在这里不起作用......
想象一下,我有以下列表
> test <- list("a" = 1, "b" = 2)
Run Code Online (Sandbox Code Playgroud)
列表的每个元素都有一个名称:
> names(test)
Run Code Online (Sandbox Code Playgroud)
现在,我想使用提取该名称,lapply()因为我想在一个将使用lapply调用的新函数中使用它.我只是不知道如何提取每个元素的名称.
我已经尝试使用deparse()和substitute(),但结果是怪异:
> lapply(test, function(x) {deparse(substitute(x))})
$a
[1] "X[[i]]"
$b
[1] "X[[i]]"
Run Code Online (Sandbox Code Playgroud)
有人有线索吗?
我想做这样的事情:我有一个类似于测试的列表:
> test <- list("a" = matrix(1, ncol = 3), "b" = matrix(2, ncol = 3))
Run Code Online (Sandbox Code Playgroud)
我想将一个函数应用于该列表,该函数转换每个元素中的数据并为每列提供特定的名称:
make_df <- function(x) {
output <- data.frame(x)
names(output) <- c("items", "type", NAME_OF_X)
return(output)
}
lapply(test, make_df)
Run Code Online (Sandbox Code Playgroud)
预期的产出是:
> test
$a
[,1] [,2] [,3]
[1,] 1 1 1
attr(,"names")
[1] "index" …Run Code Online (Sandbox Code Playgroud) 假设我们有一个list(mylist)用作lapply函数的输入对象.有没有办法知道mylist正在评估哪个元素?该方法应该起作用,lapply并且snowfall::sfApply(也可能是其他人也适用于家庭成员).
在聊天时,Gavin Simpson提出了以下方法.这很有用,lapply但不是很重要sfApply.我想避免额外的包或摆弄列表.有什么建议?
mylist <- list(a = 1:10, b = 1:10)
foo <- function(x) {
deparse(substitute(x))
}
bar <- lapply(mylist, FUN = foo)
> bar
$a
[1] "X[[1L]]"
$b
[1] "X[[2L]]"
Run Code Online (Sandbox Code Playgroud)
这是没有削减它的并行版本.
library(snowfall)
sfInit(parallel = TRUE, cpus = 2, type = "SOCK") # I use 2 cores
sfExport("foo", "mylist")
bar.para <- sfLapply(x = mylist, fun = foo)
> bar.para
$a
[1] "X[[1L]]"
$b
[1] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用一系列lapply调用来构建curried函数列表,理想情况下,在最后一次lapply调用时,返回最终的期望值.currying工作,但lapply似乎总是应用第二个应用程序后列表中的最后一个元素.
例:
curry <- function(fn, ...) {
arglist <- list(...)
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
# rcurry is used only to init the first lapply.
rcurry <- function(v1, fn, ...) {
arglist <- append(list(v1), list(...))
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
myadd <- function(a,b,c) {
a+b+c
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作:
# you can achieve the same by closure:
# curry.a <- lapply(c(10, 1000), FUN = function(a) { curry(myadd, a) })
curry.a <- lapply(list(10, …Run Code Online (Sandbox Code Playgroud) 我正在绘制一个 y 变量与多个 x 变量的关系图。我有一个使用 lapply 的工作解决方案。但是,我无法将 x 变量的名称写为每个图的 x 标签。这是我所拥有的一个简化示例:
目标是针对每个 x 变量绘制 y 变量,从而生成三个图,并将每个 x 变量的名称添加为 x 轴标签。
生成一个包含 1 个 y 变量和 3 个 x 变量的数据框:
df <- data.frame(y.variable=c(11:20), x1=c(21:30),x2=c(1:10),x3=c(31:40))
Run Code Online (Sandbox Code Playgroud)
一个应该以字符串形式检索变量名称的函数:
get_name <- function(v1) {deparse(substitute(v1))}
Run Code Online (Sandbox Code Playgroud)
生成 y 相对于 x 变量的图的函数:
generate_plot <- function(x.variable) {ggplot(data = df, aes(x.variable, y.variable )) +geom_point() + xlab(get_name(variable.name))}
Run Code Online (Sandbox Code Playgroud)
调用 lapply 对 df 的每一列执行generate_plot:
lapply(df, generate_plot)
Run Code Online (Sandbox Code Playgroud)
这会产生三个图,每个图都将“variable.x”作为其 x 标签,而不是所需的变量名称 x1、x2 和 x3。
有没有办法让la laly声明也显示索引?更具体地说,请考虑以下示例:
mylist <- list(c(5,4),c(3,2), c(1,3))
myfunction<- function(values){
print("Adding values: ")
return(values[1] + values[2])
}
lapply(mylist, myfunction)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我可以以某种方式打印"添加值:1""添加值:2"等.列表中每个元素的一个元素?
谢谢!