在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,我可以运行:在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
> 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