在R中使用字符串作为函数参数

在R中使用字符串作为函数参数,r,R,对于给定的n,我想列举所有2^(n)-1可能的子集(不包括空集) 所以对于n=3项(A,B,C),我有8-1个组合:{A},{B},{C},{A,B},{A,C},{B,C},和{A,B,C} 为了枚举这些子集,我想定义一个二进制网格。对于n=3: 然而,n本身是一个随机变量,在一个模拟到下一个模拟时会发生变化 通过编程很容易生成传递给函数调用所需的字符串。例如,对于n=7,我可以运行: > gsub(", $", "", paste(rep(&qu

对于给定的n,我想列举所有2^(n)-1可能的子集(不包括空集)

所以对于n=3项(A,B,C),我有8-1个组合:{A},{B},{C},{A,B},{A,C},{B,C},和{A,B,C}

为了枚举这些子集,我想定义一个二进制网格。对于n=3:

然而,n本身是一个随机变量,在一个模拟到下一个模拟时会发生变化

通过编程很容易生成传递给函数调用所需的字符串。例如,对于n=7,我可以运行:

> gsub(", $", "", paste(rep("0:1, ", 7), collapse = ""))

[1] "0:1, 0:1, 0:1, 0:1, 0:1, 0:1, 0:1"

但是当我试图将这个字符串传递给
expand.grid()
时,我得到了一个错误。当然,有一个函数可以将该字符串强制转换为可用的表达式?

不建议将字符串作为代码运行,通常应避免使用该函数

在这种情况下,您可以使用
replicate
将向量
n
重复几次,然后使用
expand.grid
do.call

n <- 3
do.call(expand.grid, replicate(n, list(0:1)))

#  Var1 Var2 Var3
#1    0    0    0
#2    1    0    0
#3    0    1    0
#4    1    1    0
#5    0    0    1
#6    1    0    1
#7    0    1    1
#8    1    1    1

n我们可以使用
crossing

library(dplyr)
library(tidyr)
library(stringr)
library(purrr)
n <- 3
replicate(n, list(0:1)) %>%
    set_names(str_c('Var', seq_along(.))) %>% 
    invoke(crossing, .)
# A tibble: 8 x 3
#   Var1  Var2  Var3
#  <int> <int> <int>
#1     0     0     0
#2     0     0     1
#3     0     1     0
#4     0     1     1
#5     1     0     0
#6     1     0     1
#7     1     1     0
#8     1     1     1
    
库(dplyr)
图书馆(tidyr)
图书馆(stringr)
图书馆(purrr)
n%
设置名称(str_c('Var',seq_沿边(.))%>%
调用(交叉,.)
#一个tibble:8x3
#Var1 Var2 Var3
#    
#1     0     0     0
#2     0     0     1
#3     0     1     0
#4     0     1     1
#5     1     0     0
#6     1     0     1
#7     1     1     0
#8     1     1     1

您是否考虑过这些解决方案:?由于R支持这么多用于组合和置换的函数,因此有一个更直接的解决方案并不奇怪。但是,还有其他一些时候,我希望将字符串传递给函数:例如,在迭代许多模型参数组合时。组合示例是为了获得可复制的原型。
library(dplyr)
library(tidyr)
library(stringr)
library(purrr)
n <- 3
replicate(n, list(0:1)) %>%
    set_names(str_c('Var', seq_along(.))) %>% 
    invoke(crossing, .)
# A tibble: 8 x 3
#   Var1  Var2  Var3
#  <int> <int> <int>
#1     0     0     0
#2     0     0     1
#3     0     1     0
#4     0     1     1
#5     1     0     0
#6     1     0     1
#7     1     1     0
#8     1     1     1