【发布时间】:2023-03-31 23:50:01
【问题描述】:
当单独应用于向量的每个元素时,我的函数给出的结果与使用 sapply 不同。快把我逼疯了!
我正在使用的项目:这个(简化的)参数列表另一个函数被调用:
f <- as.list(match.call()[-1])
> f
$ampm
c(1, 4)
要复制它,您可以运行以下命令:
foo <- function(ampm) {as.list(match.call()[-1])}
f <- foo(ampm = c(1,4))
这是我的功能。它只是从字符串中剥离 'c(...)'。
stripConcat <- function(string) {
sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}
单独应用时,它就是这样工作的,这就是我想要的:
> stripConcat(f)
[1] "1, 4"
但是当与 sapply 一起使用时,它会给出完全不同的东西,这是我不想要的:
> sapply(f, stripConcat)
ampm
[1,] "c"
[2,] "1"
[3,] "4"
Lapply 也不起作用:
> lapply(f, stripConcat)
$ampm
[1] "c" "1" "4"
其他任何应用函数都没有。这让我发疯——我认为 lapply 和 sapply 应该与重复应用到列表或向量的元素相同!
【问题讨论】:
-
> dput(f) structure(list(ampm = c(1, 4)), .Names = "ampm") -
这里的问题(我不完全理解)是
as.character(f)和as.character(f[[1]])之间的区别。试试sapply(as.character(f),stripConcat)。 -
这几乎可以实现!它给出了正确的答案,但删除了元素的名称:
> sapply(as.character(f), stripConcat) c(1, 4) "1, 4",而之前的“1,4”元素被命名为“ampm”。 -
我向 R 聊天室中更有经验的专家寻求帮助。如果你有耐心,我敢肯定有人会在至少几个小时内弹出解释和可能的解决方法。同时,我将删除我之前的几个 cmets,因为我的编辑使它们变得不必要。
-
感谢您的帮助 joran!