我是 R 包作者,我收到了 CRAN 的通知表,我的包将被存档,因为我的建议中的包需要有条件地使用。在我的主要代码中,它们是有条件地使用的;我写了一个check.packages()函数,如果无法加载包,它会抛出错误。但是,在我的帮助文件中的示例中,我只是用 附加了包library(),这很可能是我犯错的地方。问题出现是因为我包含在 Suggests 中的一个包被归档了。
我的问题是如何有条件地使用帮助文件示例中的包?我尝试使用
ifelse{\Sexpr{isTRUE(requireNamespace("pkg"))}}{
#Example with pkg
}{
\dontrun{
#Example with pkg
}}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果包是可加载的,则像往常一样显示示例,如果不是,则环绕\dontrun{}它。这在我预览帮助文件时有效,但 CRAN 检查告诉我我不能\ifelse在示例中使用。如果我的示例在我的建议中附加包很重要\dontrun,那么无论是否可以加载包,我是否都可以将它们全部包裹起来?
df我正在编写一个函数来从给定的 data.frame或环境中提取作为字符串提供的变量env。最初,我一直使用该eval(parse(text=s), df, env)结构来做到这一点,但我了解到还有更有效的替代方案。其他选项包括:
eval(str2lang(s), df, env)eval(str2expression(s), df, env)eval(call(s)[[1]], df, env)也可能有一个get解决方案,但我不知道它是否可以先检查变量是否在其中,df然后再检查env变量是否不在。
使用microbenchmark,似乎call是最快的:
library(microbenchmark)
x1 = 1
df = data.frame(x2 = 2)
microbenchmark(call = eval(call('x1')[[1]], df),
parse = eval(parse(text='x1'), df),
str2lang = eval(str2lang('x1'), df),
str2exp = eval(str2expression('x1'), df),
check = "identical")
#> Unit: microseconds
#> expr min lq mean median uq max neval cld
#> call 1.128 1.2115 1.60815 1.4585 1.6360 4.659 100 …Run Code Online (Sandbox Code Playgroud) 我有一个V长度为 的连续整数向量l,例如1, 2, 3, 4, 5, 6, 7。我想找到大小的所有子集,k使得子集中任意两个数字之间的差值不能小于m,例如2。使用上面的示例l = 7、k = 3和m = 2,子集是
1, 3, 5
1, 3, 6
1, 3, 7
1, 4, 6
1, 4, 7
1, 5, 7
2, 4, 6
2, 4, 7
2, 5, 7
3, 5, 7
Run Code Online (Sandbox Code Playgroud)
一种方法是枚举所有可能的大小子集k并丢弃任何不满足m约束的子集,但即使解决方案的数量很小,此过程也会爆炸。
我当前的方法是一种暴力算法,其中我从具有最小可能整数的子集开始,将最后一个条目增加 1,直到达到上限,增加前一个条目并将最后一个条目重置为可以的最低值鉴于先前条目的增加。也就是说,我从 开始1, 3, 5,然后将最后一位数字加一以获得1, 3, 6和1, 3, …