我找到了这段代码:
string = c("G1:E001", "G2:E002", "G3:E003")
> sapply(strsplit(string, ":"), "[", 2)
[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
清楚地strsplit(string, ":")返回大小为3的向量,其中每个组件i是包含Gi和的大小为2的向量E00i.
但为什么另外两个论点"[", 2只能选择那些E00i?据我所知,函数接受的唯一参数是:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
Run Code Online (Sandbox Code Playgroud)
您可以使用sub获取预期输出而不是使用strsplit/sapply
sub('.*:', '', string)
#[1] "E001" "E002" "E003"
Run Code Online (Sandbox Code Playgroud)
关于你的代码,strsplit输出是一个列表,列表可以用apply系列函数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"
Run Code Online (Sandbox Code Playgroud)
在这种情况下sapply,默认选项是simplify=TRUE
sapply(strsplit(string, ":"), `[`, 2, simplify=FALSE)
#[[1]]
#[1] "E001"
#[[2]]
#[1] "E002"
#[[3]]
#[1] "E003"
Run Code Online (Sandbox Code Playgroud)
该[可以通过匿名函数调用来代替
sapply(strsplit(string, ":"), function(x) x[2], simplify=FALSE)
#[[1]]
#[1] "E001"
#[[2]]
#[1] "E002"
#[[3]]
#[1] "E003"
Run Code Online (Sandbox Code Playgroud)
查看文档?sapply:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)\n\n FUN: the function to be applied to each element of \xe2\x80\x98X\xe2\x80\x99: see\n \xe2\x80\x98Details\xe2\x80\x99. In the case of functions like \xe2\x80\x98+\xe2\x80\x99, \xe2\x80\x98%*%\xe2\x80\x99, the\n function name must be backquoted or quoted.\n\n ...: optional arguments to \xe2\x80\x98FUN\xe2\x80\x99.\nRun Code Online (Sandbox Code Playgroud)\n\n这就是你的答案。在你的情况下,FUN是[. 在您的情况下, “可选参数fun”为“2”,因为它在您的调用中匹配...。因此,在本例中,sapply调用时将[列表中的值作为第一个参数,并将其2作为第二个参数。考虑:
x <- c("G1", "E001") # this is the result of `strsplit` on the first value\nRun Code Online (Sandbox Code Playgroud)\n\n然后:
\n\n`[`(x, 2) # equivalent to x[2]\n# [1] "E001"\nRun Code Online (Sandbox Code Playgroud)\n\n这就是sapply您的示例中正在做的事情,除了它应用于由返回的每个 2 长度字符向量strsplit。