使用 R 通过粘贴的命令动态访问结构?

Using R to access a structure dynamically with pasted commands?

我正在研究比较一组列表(仅包含字符串)并查看它们的内容是否存在于名为 "universe" 的主列表中。问题是我事先不知道要查看多少个列表,可能是 1 到 20 个或更多 - 这些是动态创建的,并且可以正常工作。下面的单行代码工作正常,但打败了我的 objective。要使用下面的代码,我将不得不创建一个开关,其中包含与潜在列表(组)一样多的选项,这很混乱。

allSE <- universe[group[[1]] & group[[2]] & group[[3]] ]

下面的两行代码创建了一个与上面方括号中的命令相同的字符串,但根本不起作用。当我知道有 20 个奇怪的匹配时,它 returns 一个 "NA"。

xnam <- paste0("group[[", 1:3,"]]")

allSE <- universe[paste(xnam, collapse= " & ")]

我已经尝试过公式命令,但它坚持使用 ~y,因为它当然用于回归并且不适合 - 那么我如何才能说服 R 它在方括号之间有命令而不是命令行字符串粗体?

一个例子

universe <- c("ted","sara","fred","billy")

group1 <- as.logical(c("TRUE","TRUE","TRUE","TRUE"))

group2 <- as.logical(c("FALSE","TRUE","FALSE","TRUE"))

group3 <- as.logical(c("FALSE","TRUE","TRUE","TRUE"))

group <- list(group1, group2, group3)

universe[group[[1]] & group[[2]]  & group[[3]]]

预期结果

应该给 sara 和 billy,因为这两个出现在所有三个列表中

我们可以使用Reduce&来比较list中对应的元素都是TRUE,它可以用来对[=26进行子集化=]

universe[Reduce(`&`, group)]
#[1] "sara"  "billy"

或者另一种选择是 rbind list 元素并执行 colSums 检查 TRUE 元素的数量是否等于 lengthlist

universe[colSums(do.call(rbind, group))==length(group)]