R 与功能的单独应用完全不同
当分别应用于向量的每个元素时,我的函数给出的结果与使用sapply不同。它快把我逼疯了 我正在使用的项:调用另一个函数时使用的(简化)参数列表:R 与功能的单独应用完全不同,r,sapply,R,Sapply,当分别应用于向量的每个元素时,我的函数给出的结果与使用sapply不同。它快把我逼疯了 我正在使用的项:调用另一个函数时使用的(简化)参数列表: f <- as.list(match.call()[-1]) > f $ampm c(1, 4) 但当与sapply一起使用时,它提供了完全不同的东西,这是我不想要的: > sapply(f, stripConcat) ampm [1,] "c" [2,] "1" [3,] "4" Lapply也不起作用: > la
f <- as.list(match.call()[-1])
> f
$ampm
c(1, 4)
但当与sapply一起使用时,它提供了完全不同的东西,这是我不想要的:
> sapply(f, stripConcat)
ampm
[1,] "c"
[2,] "1"
[3,] "4"
Lapply也不起作用:
> lapply(f, stripConcat)
$ampm
[1] "c" "1" "4"
其他任何函数都不适用。这让我发疯了——我以为Lappy和sapply应该与列表或向量元素的重复应用程序相同 我相信,您看到的差异仅仅是由于as.character如何强制列表中的元素
x2 <- list(1:3, quote(c(1, 5)))
as.character(x2)
[1] "1:3" "c(1, 5)"
lapply(x2, as.character)
[[1]]
[1] "1" "2" "3"
[[2]]
[1] "c" "1" "5"
sub
尝试将非字符的任何内容强制转换为字符。当您传递子列表时,它调用
列表上的as.character
当你给它传递一个调用时,它将调用as.character
,调用call
对于stripcontat
函数,您更希望使用列表作为输入
在这种情况下,我建议该职能采取以下措施:
stripConcat <- function(string) {
if (!is.list(string))
string <- list(string)
sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}
stripcont>dput(f)结构(list(ampm=c(1,4)),.Names=“ampm”)
这里的问题(我不完全理解)是as.character(f)
和as.character(f[[1]])
之间的区别。尝试sapply(如.character(f),stripcontcat)
。这几乎达到了目的!它给出了正确的答案,但删除了该元素的名称:>sapply(as.character(f),stripcontcat)c(1,4)“1,4”
,而之前的“1,4”元素名为“ampm”。我在R聊天室向更有经验的专家寻求帮助。如果你有耐心的话,我相信至少在几个小时内会有人给出解释和可能的解决办法。同时,我将删除我前面的几条评论,因为我的编辑使它们变得不必要。谢谢你的帮助joran!您可能应该补充一点,假设这是正确的输入,修复方法是在OP中调用deparse
function@eddi,我只是补充了一点关于修复函数的内容,但我不会使用deparse
@eddi,很抱歉我错过了你关于“假设输入正确”的评论-在这种情况下,是的。我的意思是OP的主要问题是传递错误类型的输入,因此,我将检查函数中的输入
> lapply(f, stripConcat)
$ampm
[1] "c" "1" "4"
x2 <- list(1:3, quote(c(1, 5)))
as.character(x2)
[1] "1:3" "c(1, 5)"
lapply(x2, as.character)
[[1]]
[1] "1" "2" "3"
[[2]]
[1] "c" "1" "5"
is(f)
[1] "list" "vector"
as.character(f)
[1] "c(1, 4)"
> is(f[[1]])
[1] "call" "language"
> as.character(f[[1]])
[1] "c" "1" "4"
stripConcat <- function(string) {
if (!is.list(string))
string <- list(string)
sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}