Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 与功能的单独应用完全不同_R_Sapply - Fatal编程技术网

R 与功能的单独应用完全不同

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

当分别应用于向量的每个元素时,我的函数给出的结果与使用sapply不同。它快把我逼疯了

我正在使用的项:调用另一个函数时使用的(简化)参数列表:

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)
}