我正在查看条目在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) 这是问题的简单演示:
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 在不同的表达式中使用不同的值)?在我的代码中,循环限制是动态的,因此我无法用多个静态调用替换循环。