【问题标题】:Sapply different than individual application of functionSapply 不同于单独应用功能
【发布时间】: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 应该与重复应用到列表或向量的元素相同!

【问题讨论】:

  • &gt; dput(f) structure(list(ampm = c(1, 4)), .Names = "ampm")
  • 这里的问题(我不完全理解)是as.character(f)as.character(f[[1]]) 之间的区别。试试sapply(as.character(f),stripConcat)
  • 这几乎可以实现!它给出了正确的答案,但删除了元素的名称:&gt; sapply(as.character(f), stripConcat) c(1, 4) "1, 4" ,而之前的“1,4”元素被命名为“ampm”。
  • 我向 R 聊天室中更有经验的专家寻求帮助。如果你有耐心,我敢肯定有人会在至少几个小时内弹出解释和可能的解决方法。同时,我将删除我之前的几个 cmets,因为我的编辑使它们变得不必要。
  • 感谢您的帮助 joran!

标签: r sapply


【解决方案1】:

我相信,您所看到的差异仅仅是由于 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"

f 不是调用,而是第一个元素是调用的列表。

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"

sub 试图将非字符的任何内容强制转换为字符。
当您传递子列表时,它会在 list 上调用 as.character
当你给它一个调用时,它会在那个call 上调用as.character


对于您的stripConcat 函数,您更喜欢 列表作为输入。

在这种情况下,我会为该功能推荐以下内容:

stripConcat <- function(string) {
    if (!is.list(string))
      string <- list(string)
    sub(')','',sub('c(','',string,fixed=TRUE),fixed=TRUE)
}

但是请注意,string 是用词不当,因为您似乎从未打算将stripConcat 传递给字符串。 (当然,这不是问题)

【讨论】:

  • 您可能应该补充一点,假设输入正确,解决方法是在 OP 的函数中调用 deparse
  • @eddi,我只是补充一点关于修复功能的问题,但我不会选择deparse
  • @eddi,抱歉,我错过了您关于“假设输入正确”的评论——在这种情况下,是的,是的。我的意思是 OP 的主要问题是传递了错误类型的输入,因此,我会检查函数中的输入
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2014-04-11
  • 2013-09-03
相关资源
最近更新 更多