Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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:sapply/lapply不同的名字行为_R - Fatal编程技术网

R:sapply/lapply不同的名字行为

R:sapply/lapply不同的名字行为,r,R,我将一些问题简化为以下玩具代码: cc<-c("1","2") ff<-function(x) { list(myname=x)} aa<-unlist(lapply(cc,ff)) bb<-sapply(cc,ff) 但是,我知道sapply的USE.NAMES参数- 就像- 使用.logical名称;如果为TRUE且X为字符,则使用X作为 结果,除非它已经有名称 所以在这种情况下应该没有影响 在内部,它甚至没有传递到simp

我将一些问题简化为以下玩具代码:

cc<-c("1","2")
ff<-function(x) { list(myname=x)}

aa<-unlist(lapply(cc,ff))
bb<-sapply(cc,ff)
但是,我知道sapply的USE.NAMES参数-

  • 就像-
  • 使用.logical名称;如果为TRUE且X为字符,则使用X作为 结果,除非它已经有名称

    所以在这种情况下应该没有影响

  • 在内部,它甚至没有传递到simplify2array,因此也没有传递到最终的unlist
  • 这是怎么回事?这可能是一个R问题吗


    编辑:进一步调查后发现,造成差异的根本原因是Sappy本质上等同于非Sappy

    unlist(lappy(cc,ff)

    而是

    unlist(lappy(cc,ff),recursive=FALSE)


    (这是确切的内部未列出调用)。

    请仔细查看以下内容:

    lapply(cc, ff)
    #> [[1]]
    #> [[1]]$myname
    #> [1] "1"
    #>
    #>
    #> [[2]]
    #> [[2]]$myname
    #> [1] "2"
    
    lappy
    本身的输出没有名称。请看:

    a <- lapply(cc, ff)
    names(a)
    #> NULL
    
    因此,事实上,
    USE.NAMES
    将应用,
    sapply
    cc
    的内容指定为
    lappy
    输出的名称,如文档中所述,
    sapply
    是一个薄型包装器。遵循代码非常简单:

    sapply
    #> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
    #> {
    #>     FUN <- match.fun(FUN)
    #>     answer <- lapply(X = X, FUN = FUN, ...)
    #>     if (USE.NAMES && is.character(X) && is.null(names(answer))) 
    #>         names(answer) <- X
    #>     if (!isFALSE(simplify) && length(answer)) 
    #>         simplify2array(answer, higher = (simplify == "array"))
    #>     else answer
    #> }
    #> <bytecode: 0x036ae7a8>
    #> <environment: namespace:base>
    
    sapply
    #>函数(X,FUN,…,simplify=TRUE,USE.NAMES=TRUE)
    #> {
    #>有趣的答案if(使用.NAMES&&is.character(X)和&is.null(NAMES(答案)))
    #>如果(!isFALSE(simplify)和长度(answer))则命名(答案)
    #>simplify2array(答案,更高=(simplify=“数组”))
    #>其他答案
    #> }
    #> 
    #> 
    
    但是
    cc
    没有名字,所以它们是added@user20650ff添加了名称。我将“除非它有名称”中的it取为X,输入不是结果,但重读时我可能会弄错…(这里发生的事情
    name(cc)=c(“A”,“B”);sapply(cc,ff)
    )谢谢,但请注意,它以某种方式巧妙地连接了预先存在的名称和cc的内容。我不确定这是否是预期的行为。@OfekShilon它是预期的行为。它将名称关联起来,因为一旦它将名称添加到顶级列表中,它将嵌套列表简化为一个层。当它这样做时,它将关联起来测试第一层和第二层的名称。请尝试
    取消列表(list(a=list(b=1),c=list(d=1))
    以了解我的意思啊,谢谢。以及类()中的差异原因?Simpled2Array本质上是对unlist的包装。我接受答案,但请注意我在问题中添加的其他信息。@OfekShilon谢谢,谢谢您提供的额外信息。
    names(a[[1]])
    #> [1] "myname"
    names(a[[2]])
    #> [1] "myname"
    
    sapply
    #> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) 
    #> {
    #>     FUN <- match.fun(FUN)
    #>     answer <- lapply(X = X, FUN = FUN, ...)
    #>     if (USE.NAMES && is.character(X) && is.null(names(answer))) 
    #>         names(answer) <- X
    #>     if (!isFALSE(simplify) && length(answer)) 
    #>         simplify2array(answer, higher = (simplify == "array"))
    #>     else answer
    #> }
    #> <bytecode: 0x036ae7a8>
    #> <environment: namespace:base>