小编Ale*_*ein的帖子

"2 ^ n - 1"的De Bruijn式序列:它是如何构建的?

我正在查看条目在O(lg(N))操作中查找N位整数的日志基数2,并使用Bit Twiddling hacks 进行乘法和查找.

我可以很容易地看到该条目中的第二个算法是如何工作的

static const int MultiplyDeBruijnBitPosition2[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = MultiplyDeBruijnBitPosition2[(uint32_t)(v * 0x077CB531U) >> 27];
Run Code Online (Sandbox Code Playgroud)

计算n = log2 v在哪里v知道2的幂.在这种情况下0x077CB531是一个普通的De Bruijn序列,其余的是显而易见的.

但是,该条目中的第一个算法

static const int MultiplyDeBruijnBitPosition[32] =
{
  0, 9, 1, 10, 13, 21, 2, …
Run Code Online (Sandbox Code Playgroud)

algorithm bit-manipulation logarithm discrete-mathematics

30
推荐指数
1
解决办法
4135
查看次数

在延迟表达式评估中,R Shiny使用变量的更改值

这是问题的简单演示:

library(shiny)

ui <- fluidPage(
    textOutput("Text1"),
    textOutput("Text2")
)

server <- function(input, output) {
    for(i in 1:2) {
        id <- paste0("Text", i)
        output[[id]] <- renderText(paste0("This is text #", i)) # Problem!
    }
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

该程序产生输出

这是文字#2
这是文字#2

而不是#1和#2。

显然,Shiny将传递给的表达式存储在renderText()标记为#问题!,并在for循环结束对其进行评估。这些表达式取决于variable i,并且其最终值i = 2用于评估两个表达式。

i在仍然使用循环的情况下,如何产生正确的输出(如何强制Shiny 在不同的表达式中使用不同的值)?在我的代码中,循环限制是动态的,因此我无法用多个静态调用替换循环。

r shiny

4
推荐指数
1
解决办法
108
查看次数