首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以字符串为输入的data.table CJ

以字符串为输入的data.table CJ
EN

Stack Overflow用户
提问于 2018-02-28 00:25:50
回答 2查看 138关注 0票数 0

如何将字符串作为输入来运行CJ-command?以下MNWE说明了所需的内容:

代码语言:javascript
复制
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)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-28 08:41:30

IIUC,您正在寻找一个将一组参数传递到函数的...中的函数。您可以使用do.call完成此操作,如下所示:

代码语言:javascript
复制
do.call(CJ, eval(parse(text=paste0("list(",use.text,")"))))

希望这就是你要找的……

票数 1
EN

Stack Overflow用户

发布于 2018-02-28 01:40:48

get-function是将字符值提升为真实R名称值的标准方法。

这就是你想要的:

代码语言:javascript
复制
col.wanted =2
dt.wanted[ , get(paste0("X.", col.wanted) )]
#[1] 1 2 1 2

根据对更复杂表达式的求值获得多个列可能需要更多的巴洛克风格的工作:

代码语言:javascript
复制
> 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   2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49013403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档