具有两个参数的函数 returns 当参数相等时
Function with two arguments that returns when arguments are equal
我正在尝试创建一个带有两个参数的函数。它会重复调用第一个参数,在我的例子中
f()
直到 f returns 相同的值连续 3 次。然后它将调用第二个参数
g()
并且如果 g returns 与 f returned 之前的值相同,那么函数必须 return 这个值。否则它将返回并再次调用第一个参数 f() 并重复循环。
这就是我目前所拥有的。
call_until = function(f, g) {
while(1) {
n = f %>% chunk(3) %>% filter(f, function(v) length(unique(v)) == 1)
x = n()[1]
if (x == g()) {
return(x)
}
}
}
比如连续3次freturns 4,则转到g。如果 g 等于 f return 连续三次(在本例中为 4);所以如果 g == 4,那么 call_until 应该 return 4.
以下是如何实施的示例:
f <- function(){
return(sample(1:10,1))
}
g <- f
call_until <- function(f, g){
results <- c(f(), f(), f())
test <- g()
while(length(unique(results)) > 1 || test != results[3]){
results <- c(results[2:3], f())
test <- g()
}
return(test)
}
现在我在这里创建了一些简单的函数 f;g
,它们会在 1-10
之间随机选择(甚至不需要参数作为输入)。所以这可能需要调整。以下是一些输出:
> call_until(f,g)
[1] 3
> call_until(f,g)
[1] 7
> call_until(f,g)
[1] 10
> call_until(f,g)
[1] 9
递归函数可能不是最佳选择,请考虑将此答案作为一个选项。
f <- function(){
sample(1:2, 1)
}
g <- function(){
sample(1:2, 1)
}
fg <- function(f, g){
res <- c(replicate(3, f()), g())
message(paste("[-] f():", paste(res[1:3], collapse = ","),
"g():", res[4], "\n"))
if(var(res) == 0){
message(paste("[+] Magic value is ", res[1]))
return(invisible(res[1]))
}
return(fg(f, g))
}
fg(f,g)
[-] f(): 1,1,1 g(): 2
[-] f(): 1,1,1 g(): 2
[-] f(): 1,2,2 g(): 1
[-] f(): 2,1,1 g(): 2
[-] f(): 1,1,1 g(): 2
[-] f(): 1,2,2 g(): 1
[-] f(): 1,1,1 g(): 1
[+] Magic value is 1
这是您如何执行此操作的另一个示例
call_until = function(f, g) {
while(TRUE) {
value <- f()
seen <- 1
while(seen < 3) {
next_value <- f()
if (next_value == value) {
seen <- seen + 1
} else {
value <- next_value
seen <- 1
}
}
if (value == g()) {
return(value)
}
}
}
尽管如果 g
不匹配或只绘制一个新值,您应该绘制三个新的 f
值,这很重要。
这里有一些有用的测试函数。它们只是按顺序 return 来自向量的值,必要时重复。
cycler <- function(vals) {
i <- 1
function() {
i<<-i+1
vals[(i-2) %% length(vals)+1]
}
}
f <- cycler(c(1,2,2,2,3,4,5,5,5,1,1))
g <- cycler(c(5,4))
有了这个我们得到
call_until(f, g)
# [1] 5
我正在尝试创建一个带有两个参数的函数。它会重复调用第一个参数,在我的例子中
f()
直到 f returns 相同的值连续 3 次。然后它将调用第二个参数
g()
并且如果 g returns 与 f returned 之前的值相同,那么函数必须 return 这个值。否则它将返回并再次调用第一个参数 f() 并重复循环。
这就是我目前所拥有的。
call_until = function(f, g) {
while(1) {
n = f %>% chunk(3) %>% filter(f, function(v) length(unique(v)) == 1)
x = n()[1]
if (x == g()) {
return(x)
}
}
}
比如连续3次freturns 4,则转到g。如果 g 等于 f return 连续三次(在本例中为 4);所以如果 g == 4,那么 call_until 应该 return 4.
以下是如何实施的示例:
f <- function(){
return(sample(1:10,1))
}
g <- f
call_until <- function(f, g){
results <- c(f(), f(), f())
test <- g()
while(length(unique(results)) > 1 || test != results[3]){
results <- c(results[2:3], f())
test <- g()
}
return(test)
}
现在我在这里创建了一些简单的函数 f;g
,它们会在 1-10
之间随机选择(甚至不需要参数作为输入)。所以这可能需要调整。以下是一些输出:
> call_until(f,g)
[1] 3
> call_until(f,g)
[1] 7
> call_until(f,g)
[1] 10
> call_until(f,g)
[1] 9
递归函数可能不是最佳选择,请考虑将此答案作为一个选项。
f <- function(){
sample(1:2, 1)
}
g <- function(){
sample(1:2, 1)
}
fg <- function(f, g){
res <- c(replicate(3, f()), g())
message(paste("[-] f():", paste(res[1:3], collapse = ","),
"g():", res[4], "\n"))
if(var(res) == 0){
message(paste("[+] Magic value is ", res[1]))
return(invisible(res[1]))
}
return(fg(f, g))
}
fg(f,g)
[-] f(): 1,1,1 g(): 2
[-] f(): 1,1,1 g(): 2
[-] f(): 1,2,2 g(): 1
[-] f(): 2,1,1 g(): 2
[-] f(): 1,1,1 g(): 2
[-] f(): 1,2,2 g(): 1
[-] f(): 1,1,1 g(): 1
[+] Magic value is 1
这是您如何执行此操作的另一个示例
call_until = function(f, g) {
while(TRUE) {
value <- f()
seen <- 1
while(seen < 3) {
next_value <- f()
if (next_value == value) {
seen <- seen + 1
} else {
value <- next_value
seen <- 1
}
}
if (value == g()) {
return(value)
}
}
}
尽管如果 g
不匹配或只绘制一个新值,您应该绘制三个新的 f
值,这很重要。
这里有一些有用的测试函数。它们只是按顺序 return 来自向量的值,必要时重复。
cycler <- function(vals) {
i <- 1
function() {
i<<-i+1
vals[(i-2) %% length(vals)+1]
}
}
f <- cycler(c(1,2,2,2,3,4,5,5,5,1,1))
g <- cycler(c(5,4))
有了这个我们得到
call_until(f, g)
# [1] 5