我无法理解括号如何/为什么在它们不应该起作用的地方起作用\xc2\xae。
\nf = function(...) substitute(...()); f(a, b)\n[[1]]\na\n[[2]]\nb\n# but, substitute returns ..1\nf2 = function(...) substitute(...); f2(a, b)\na\nRun Code Online (Sandbox Code Playgroud)\n通常会抛出错误,找不到在不正确的上下文中使用的函数“...”或\'...\' ,例如在调用时(\\(...) ...())(5)。
我尝试过的\
n我查看了源代码以substitute找出为什么这里不会发生这种情况。R 内部1.1.1 和 1.5.2 表示...是 SEXPTYPE DOTSXP,一对承诺列表。这些承诺是由 提取的substitute。
# \\-substitute #R\n# \\-do_substitute #C\n# \\-substituteList #C recursive\n# \\-substitute #C\nRun Code Online (Sandbox Code Playgroud)\n逐行进行,我陷入了困境substituteList,其中h是当前正在处理的元素...。这在第 2832 行递归发生if (TYPEOF(h) == DOTSXP) h = substituteList(h, R_NilValue);。我没有...()在源代码中找到案例的异常处理,所以我怀疑在此之前发生了什么。 …
tl;dr \n许多功能请求因维护负担而被 R-core 拒绝,但不是hashtab(R>4.2.0)。?hashtab声称可以有效地将键与值关联起来。存在许多其他实现(hash、r2r、hashmap等),以及环境和用户友好的扩展(rlang、RC、R6等)。hashtab除了对象混淆和任意键之外,我还没有找到比其他更有效的明显用例。
问题
\nhashtab除了任意键之外,是否具有独特的功能,或者对于某些用例来说,在速度、内存或语法方面是否有明显的好处?
我试图研究环境和hashtab.
set.seed(1)\nmake_hash <- function(n, keys, values) {\n h <- hashtab("identical", n)\n for(i in seq_along(keys)) sethash(h, keys[i], values[[i]])\n h\n}\nmake_env <- function(n, keys, values) setNames(values, keys) |> list2env(size = n)\n\nget_mem <- function(x) as.numeric(lobstr::obj_size(x)) * 0.001\ncompare <- function(n, keylen) {\n keys …Run Code Online (Sandbox Code Playgroud) 我编写了一个宏,通过使用存储在dict. 在此示例中,它插入了引发错误的函数名称,请参阅discourse和。@__FUNCTION__
exception = Dict(:foo => ("bar ~", ArgumentError))\nmacro \xe2\x9b\x94(id)\n msg, type = exception[id]\n quote\n msg = replace($msg, "~" => StackTraces.stacktrace()[1].func)\n throw($type(msg))\n end \nend\nRun Code Online (Sandbox Code Playgroud)\n这在f使用位置参数时效果很好,
f(x, p) = p < 5 ? x : @\xe2\x9b\x94 foo\nf(1, 10)\n#> ERROR: ArgumentError: bar f\nRun Code Online (Sandbox Code Playgroud)\n但#..#在使用关键字参数时显示。
g(x; p = 3) = p < 5 ? x : @\xe2\x9b\x94 foo\ng(1, p = 10)\n#> ERROR: ArgumentError: bar #g#N\nRun Code Online (Sandbox Code Playgroud)\n这N是会话中计算的第 …
我正在计算存储在列表中的一些值,并将该列表附加到一个名为 的现有列表中results。在某些情况下,计算会返回TRUE。TRUE在这种情况下,我想删除从列表返回的元素:
my_list
$`0`
[1] TRUE
$`1`
[1] TRUE
my_list = lapply(list(my_list), function(x){Filter(Negate(isTRUE), x)})
> my_list
[[1]]
named list()
Run Code Online (Sandbox Code Playgroud)
这将返回一个空列表。现在我想检查一下:
问题是当我检查时
length(my_list) >0
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
如何检测列表是否为空?