作为参数传递给应用函数的带引号的方括号的确切含义是什么?

What is the precise meaning of the quoted square bracket passed as a parameter to apply functions?

在编程语言 R 中,

的确切含义是什么
'['

在以下代码部分用作 sapply() 和 lapply() 的参数:

dd <- data.frame(
    A = c(1L, 2L, 3L), 
    B = c(4L, 5L, 6L), 
    C = c("X1=7;X2=8;X3=9",
          "X1=13;X2=14",
          "X1=5;X2=1;X3=8")
)
namev <- function(x) {
    a <- strsplit(x,"=")
    setNames(sapply(a,'[',2), sapply(a,'[',1))
}

vv <- lapply(strsplit(as.character(dd$C),";"), namev)

nm <- unique(unlist(sapply(vv, names)))

#extract data from all rows for every column
nv <- do.call(rbind, lapply(vv, '[', nm))

dd$C [1] X1=7;X2=8;X3=9 X1;; X1=13;X2=14
Levels: X1;; X1=13;X2=14 X1=7;X2=8;X3=9

@Henrik 两个答案的答案是一样的但是问题是不一样的。这个被标记为重复的问题 (Using '[' square bracket as a function for lapply in R ) 预先假定一个知识 [ 是一个对我们 R 新手来说不是不言自明的函数。

[ 是一个函数。

iris[1,2] 等价于 '['(iris,1,2)

它需要被引用才能以这种方式使用,因为它不是语法上有效的名称(参见 ?make.names)。

不过您可以引用任何函数:

'head'(iris)

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

仅供参考,magrittr 包包括 extractextract2 函数,它们与函数 [[[ 相同,但对某些人来说可能更具可读性(并且可以在没有引号的情况下使用它们)。

[<-[[<- 也是函数,在分配给 vector/matrix/data.frame/[= 的元素时使用25=] 并且在 magrittr

中有别名 insetinset2

很确定这是重复的。无论哪种方式,它都充当子集函数。即:

a <- list(c(2,5),c(24,4),c(15,3))
lapply(a,'[',2)

将return包含543的列表。

它指的是您将使用两个括号执行的索引操作背后的函数:例如 x[3] 实际上只是一个函数调用 "["(x, 3)

[ 是一个函数。在下面的示例中,它与两个参数一起使用。

L <- list(a = 1:4, b = 1:3)

sapply(L, `[`, 2)
## a b 
## 2 2 

上面的 sapply 与以下任何一个相同:

sapply(L, function(x) `[`(x, 2))

sapply(L, function(x) x[2])

它是 R 中的原始函数,其 R 源代码如下,即它指向底层 C 代码。

`[`
## .Primitive("[")

可以为它编写S3方法。例如,这些方法在 vanilla R 中可用。

> methods("[")
 [1] [,nonStructure-method [.acf*                [.AsIs               
 [4] [.bibentry*           [.data.frame          [.Date               
 [7] [.difftime            [.Dlist               [.factor             
[10] [.formula*            [.getAnywhere*        [.hexmode            
[13] [.listof              [.noquote             [.numeric_version    
[16] [.octmode             [.pdf_doc*            [.person*            
[19] [.POSIXct             [.POSIXlt             [.raster*            
[22] [.roman*              [.SavedPlots*         [.simple.list        
[25] [.table               [.terms*              [.ts*                
[28] [.tskernel*           [.warnings           
see '?methods' for accessing help and source code

例如,尝试以下操作以查看这些方法的 R 源代码:

`[.data.frame`

`[.Date`