如何将字符串作为输入来运行CJ-command?以下MNWE说明了所需的内容:
library(data.table)
# This is the desired output (when needed.cols==2)
dt.wanted <- CJ(X.1=c(1L, 2L), X.2=c(1L, 2L))
# Here is an example with needed.cols as variable
needed.cols <- 2L
use.text <- paste0("X.", 1L:needed.cols, "=c(1L, 2L)", collapse=", ")
# Here are some failing attempts
dt.fail <- CJ(use.text)
dt.fail <- CJ(eval(use.text))
dt.fail <- CJ(get(use.text))所以我想让它成为可脚本化的use.text (因为它是变化的,不仅仅是needed.cols)。
发布于 2018-02-28 08:41:30
IIUC,您正在寻找一个将一组参数传递到函数的...中的函数。您可以使用do.call完成此操作,如下所示:
do.call(CJ, eval(parse(text=paste0("list(",use.text,")"))))希望这就是你要找的……
发布于 2018-02-28 01:40:48
get-function是将字符值提升为真实R名称值的标准方法。
这就是你想要的:
col.wanted =2
dt.wanted[ , get(paste0("X.", col.wanted) )]
#[1] 1 2 1 2根据对更复杂表达式的求值获得多个列可能需要更多的巴洛克风格的工作:
> use.text <- paste0("list(", paste0("X.", 1L:needed.cols, collapse=", "),")")
> use.text
[1] "list(X.1, X.2)"
> dt.wanted[ , eval(use.text)]
[1] "list(X.1, X.2)"
> dt.wanted[ , parse(text=use.text)]
expression(list(X.1, X.2))
> dt.wanted[ , eval(parse(text=use.text))]
X.1 X.2
1: 1 1
2: 1 2
3: 2 1
4: 2 2https://stackoverflow.com/questions/49013403
复制相似问题