- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下函数,如果条件为 TRUE
`==<-` <- function (e1, e2, value) replace(e1, e1 == e2, value)
如果 x == 3
将 x 替换为 42 :
x <- 3
x == 3 <- 42
x
# [1] 42
到目前为止一切顺利,但如果 value
有副作用怎么办?到目前为止,即使我的条件为 FALSE
,它也会被评估。
# desired: if x == 100, stop
x == 100 <- stop("equals 100!")
# Error: equals 100!
有办法解决这个问题吗?
请参阅下面我发现的一些解决方法,但我想看看是否还有更多解决方法。
编辑:
这解决了 sotos 的评论:
`==<-` <- function (e1, e2, value) {
cond <- e1 == e2
if(any(cond))
replace(e1, cond, value)
else e1
}
x <- 3; x == 100 <- 'xyz'
x
# [1] 3
最佳答案
这里有一些解决这个问题的方法:
quote
并修改==<-
所以它总是评估引用的调用~
作为引用函数~
作为功能和使用的简写 rlang::as_function
delay
引用输入并添加一个类 delayed
这样只有未加引号的输入和 delayed
引用的输入将被评估。<-
认识==<-
总是delay
lhs最后一种方法是唯一一种无需更改界面即可工作的方法,尽管它可以通过覆盖 <-
来工作。这通常是不可取的。
quote
并修改==<-
所以它总是评估引用的调用如果我们知道我们不想分配未评估的调用我们可以确保我们的函数评估一切,并引用我们的输入。
`==<-` <- function (e1, e2, value) {
cond <- e1 == e2
if(any(cond))
replace(e1, e1 == e2, eval.parent(value))
else e1
}
x <- 42
x == 100 <- quote(stop("equals 100!"))
x <- 100
x == 100 <- quote(stop("equals 100!"))
# Error in eval(expr, envir, enclos) : equals 100!
~
作为引用函数如果我们知道我们不想分配公式 我们可以使用~
而不是引用。
`==<-` <- function (e1, e2, value) {
cond <- e1 == e2
if(any(cond))
replace(e1, e1 == e2,
if(inherits(value, "formula"))
eval.parent(as.list(value)[[2]])
else
value)
else e1
}
x <- 42
x == 100 <- ~stop("equals 100!")
x <- 100
x == 100 <- ~stop("equals 100!")
# Error in eval(expr, envir, enclos) : equals 100!
~
作为功能和使用的简写 rlang::as_function
如果我们知道我们不想分配函数或公式,我们可以更进一步并从中构建一个特征。
`==<-` <- function (e1, e2, value) {
cond <- e1 == e2
if(any(cond))
replace(e1, e1 == e2,
if(inherits(value, "formula") || is.function(value))
rlang::as_function(value)(e1)
else
value)
else e1
}
x <- 42
x == 100 <- ~stop("equals 100!")
x <- 100
x == 100 <- ~stop("equals 100!")
# Error in eval(expr, envir, enclos) : equals 100!
x == 100 <- sqrt
x
# [1] 10
delay
引用输入并添加一个类 delayed
我们可以创建一个函数delay
这将 quote
value
表达式并添加一个类 "delayed"
我们的功能将识别为 trigger
在适当的时候打电话:
`==<-` <- function (e1, e2, value) {
cond <- e1 == e2
if(any(cond))
replace(e1, e1 == e2,
if (inherits(x,"delayed")) eval.parent(x) else x)
else e1
}
delay <- function(x) {
x <- substitute(x)
class(x) <- "delayed"
x
}
x <- 42
x == 100 <- delay(stop("equals 100!"))
x <- 100
x == 100 <- delay(stop("equals 100!"))
# Error in eval(expr, envir, enclos) : equals 100!
好的部分是它可以处理任何可能触发错误的代码,坏的部分是delay
是一个奇怪的函数,只有在特定的上下文中才有意义。
我们可以通过引用包帮助定义一个合适的打印方法来减轻这种尴尬:
print.delayed <- function(x,...){
message(
"Delayed call, useful as a `value` argument of `mmassign` assignment functions.\n",
"See ?mmassign::delay.")
print(unclass(x),...)
x
}
delay(stop("equals 100!"))
# delayed call, useful as a `value` argument of `mmassign` assignment functions.
# See ?mmassign::delay.
# stop("equals 100!")
我们可以用同样的原理设计一个STOP
将表现“延迟”的函数
STOP <- function(...) `class<-`(substitute(stop(...)), "delayed")
x <- 42
x == 100 <- STOP("equals 100!")
x <- 100
x == 100 <- STOP("equals 100!")
# Error in eval(expr, envir, enclos) : equals 100!
STOP("equals 100!")
# delayed call, useful as a `value` argument of `mmassign` assignment functions.
# See ?mmassign::delay.
# stop("equals 100!")
<-
认识==<-
总是delay
lhs如果我们覆盖 <-
我们可以让它工作,但这当然是不好的做法,所以只是为了好玩。如果LHS的第一个元素是==
, 然后引用值并添加类 "delayed"
并按上述步骤进行。
`<-` <- function(e1,e2) {
.Primitive("<-")(lhs, match.call()[[2]])
if(length(lhs) > 1 && identical(lhs[[1]],quote(`==`))) {
invisible(eval.parent(substitute(
.Primitive("<-")(e1,e2),
list(e1=substitute(e1),
e2= substitute(`class<-`(quote(e2),"delayed"))
))))
} else {
invisible(eval.parent(substitute(.Primitive("<-")(e1,e2))))
}
}
x <- 4
x == 100 <-stop("equals 100!")
x <- 100
x == 100 <-stop("equals 100!")
# Error in eval(expr, envir, enclos) : equals 100!
关于r - 如何解决 `fun<-` 从评估 `value` 开始的事实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54574247/
我试过谷歌搜索但找不到准确的答案,所以请允许我尝试在这里提问。如果问题看起来不合适,请告诉我,我会删除它。 在 JS 中,您可以通过三种不同的方式编写特定的内置功能: 字符串长度 str.toStri
在《Professional JavaScript for Web Developers》第三版一书中,它说: var name = "The window"; var object = {
我试图找到答案,但是我经常失败。我有一个带有一列字符串的数据框。我想计算该列每个条目中的字符数,并用计数替换字符串列。 data[,29]=apply(data[,29],nchar()) Out[2
class A(object): def fun(self): pass ins_a = A.fun ins_b = A().fun 我遇到了这段代码,但我无法理解这两个对象之
表达式fun和&fun的类型是否相同? 考虑以下代码: template void check(T) { static_assert(is_same::value); } void fun(
我遇到了一段代码,如下所示 qsort(array, 10, sizeof(int), sort); 这里 sort 又是一个函数。但我一直觉得任何被调用的函数都应该在函数名称后加上 () ,或者我错
void fun(){ std::cout << "hello" << std::endl; } namespace enc{ using ::fun; } 上面的这段代码没有错误。我
源代码: static bool cmp(pair& m, pair& n) { return m.second > n.second; } priority_queue, vector>,
setTimeout 的行为有点令人困惑,我读过的所有资源都表明,当没有指定延迟时,任务将被附加到队列末尾,并在解释器无事可做时执行(空队列?)。但是,请看以下示例: setTimeout(funct
我正在使用一些内置函数 fun(void **args) 并调用这个传递参数的函数 fun(args); 所以 是什么意思void **args 以及如何检查值 args 在 C 中有什么。 void
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How come pointer to a function be called without deref
我正在使用 dlsym 来填充函数指针,它是 call 的一个成员变量。像下面一样 class ABC { private: void (*m_fun) (int); } 现在如果我分配 m_
在reactjs中使用功能组件时,我有一个onClick事件处理程序。 我按以下方式调用它; onClick={ props.function } 而不是; onClick={ props.funct
哪个语句更有效 --> perl 中的 goto &fun($val) 或 fun($val)?何时使用哪个语句以获得更好的性能?请告诉我答案! 最佳答案 我认为这是一个错误的问题。 fun($val
我正在考虑有关 suspend 的事情Arrow 的文档详细解释了:suspend () -> A提供与 IO 相同的保证. 因此,根据文档,只需使用 suspend我们正在将不纯函数转换为纯函数:
谁能告诉我 我使用这个方法“[aClass respondsToSelector:@selector(fun)]”来查找任何类(class)中是否有乐趣 但是当 fun 有三个参数时我该如何处理呢??
下面是在使用new创建的对象上定义方法的两种方法。关键词。我正在尝试比较每种方法的工作原理和效果。 1) 函数式 mixin asCircle被定义为。然后.call将 mixin 注入(inject
如主题标题。当我写:void fun(int *tab){} 和写 void fun(int tab[]){} 一样吗? 最佳答案 是的。 void fun(int *tab){} void fun(
在 lib Bullet 中定义了一个类型: typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDi
我愿意: Prelude> "sone" ++ "otehr" "soneotehr" 但是这样的代码: addOneToElement :: [a] -> [a] addOneToElement e
我是一名优秀的程序员,十分优秀!