我找到了这段代码:
string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
显然strsplit(string, ":")
会返回大小为3的向量,其中每个组件i是包含Gi
和E00i
的大小为2的向量。
但为什么另外两个参数"[", 2
只能选择那些E00i
?据我所知,函数接受的唯一参数是:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
答案 0 :(得分:5)
您可以使用sub
来获取预期的输出,而不是使用strsplit/sapply
sub('.*:', '', string)
#[1] "E001" "E002" "E003"
关于您的代码,strsplit
输出是一个列表,列表可以使用应用族函数sapply/lapply/vapply/rapply
等进行处理。在这种情况下,每个列表元素的长度为2,我们选择第二个元件。
strsplit(string, ":")
#[[1]]
#[1] "G1" "E001"
#[[2]]
#[1] "G2" "E002"
#[[3]]
#[1] "G3" "E003"
lapply(strsplit(string, ":"), `[`, 2)
#[[1]]
#[1] "E001"
#[[2]]
#[1] "E002"
#[[3]]
#[1] "E003"
如果是sapply
,则默认选项为simplify=TRUE
sapply(strsplit(string, ":"), `[`, 2, simplify=FALSE)
#[[1]]
#[1] "E001"
#[[2]]
#[1] "E002"
#[[3]]
#[1] "E003"
[
可以用匿名函数调用替换
sapply(strsplit(string, ":"), function(x) x[2], simplify=FALSE)
#[[1]]
#[1] "E001"
#[[2]]
#[1] "E002"
#[[3]]
#[1] "E003"
答案 1 :(得分:2)
因为strsplit()
的输出是一个列表。 “[”表示列表的元素,2表示选择列表成员的第二项。 sapply()
函数确保为列表的每个成员完成此操作。此处[
是sapply()
中的函数,该函数应用于strsplit()
列表,并使用附加参数2进行调用。
> strsplit(string, ":")
#[[1]]
#[1] "G1" "E001"
#
#[[2]]
#[1] "G2" "E002"
#
#[[3]]
#[1] "G3" "E003"
#
> str(strsplit(string, ":"))
#List of 3
# $ : chr [1:2] "G1" "E001"
# $ : chr [1:2] "G2" "E002"
# $ : chr [1:2] "G3" "E003"
答案 2 :(得分:2)
查看?sapply
的文档:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
FUN: the function to be applied to each element of ‘X’: see
‘Details’. In the case of functions like ‘+’, ‘%*%’, the
function name must be backquoted or quoted.
...: optional arguments to ‘FUN’.
你的答案就在于此。在您的情况下,FUN
为[
。 “fun
”的“可选参数”在您的情况下为“2”,因为它与您呼叫中的...
匹配。因此,在这种情况下,sapply
调用[
,列表中的值作为第一个参数,2
作为第二个参数。考虑:
x <- c("G1", "E001") # this is the result of `strsplit` on the first value
然后:
`[`(x, 2) # equivalent to x[2]
# [1] "E001"
这是sapply
在您的示例中所做的事情,除了它适用于strsplit
返回的每2个长度字符向量。