R新手技术问询:如何在knitr中跨代码块引用简单向量?
在knitr中跨代码块共享变量的最优方法
嘿,作为R语言新手能自己折腾课外项目真的超棒!关于你问的在knitr里从一个代码块引用向量到另一个的问题,其实核心逻辑很简单——knitr默认会把整个文档的代码块放在同一个R会话里运行,也就是说,只要前面的代码块执行过,定义的变量就会保存在会话环境中,后面的代码块直接调用就行啦。
针对你的例子,我帮你调整下代码,顺便解释下问题点:
第一步:修正用户输入代码块
你原来的输入代码块里有个非标准的REPLACE=FALSE选项,这个不是knitr支持的参数,直接删掉就好。调整后的代码块如下:
{r User Input, echo=FALSE} redoffensedicenumber <- as.numeric(readline(prompt="Red Dice : ")) blackoffensedicenumber <- as.numeric(readline(prompt="Black Dice : ")) whiteoffensedicenumber <- as.numeric(readline(prompt="White Dice : "))
这里echo=FALSE的作用是让输入过程不会显示在最终的输出文档里,完全没问题。
第二步:调整存储矩阵代码块
你原来的第二个代码块加了eval=FALSE,这会让knitr跳过执行这个代码块,自然就没法用上前面的变量啦。如果只是不想让这个代码块的代码显示在输出里,可以保留include=FALSE或者echo=FALSE,但必须确保eval=TRUE(这是默认值,所以可以不写)。调整后的代码:
{r Create Storage Matrix} zero <- c(0) # 先计算总骰子数,让代码更清晰 total_dice_count <- redoffensedicenumber + blackoffensedicenumber + whiteoffensedicenumber storagematrix <- matrix(zero, nrow = 10000, ncol = total_dice_count, byrow = TRUE)
如果你不想让这个代码块的内容出现在输出里,就把代码块开头改成{r Create Storage Matrix, include=FALSE}或者{r Create Storage Matrix, echo=FALSE}就行。
几个关键注意点
- 执行顺序很重要:knitr是按文档里代码块的先后顺序执行的,所以定义变量的代码块一定要放在使用它的代码块前面,别搞反了。
- 交互式输入的小提醒:当你点击Knit按钮生成文档时,
readline会在R的控制台弹出输入提示,记得去控制台输入数值,不是在R Markdown文档里输入哦。 - 调试小技巧:如果不想每次knit都手动输入数值,可以先把变量直接赋值(比如
redoffensedicenumber <- 3),等代码调试没问题了再改回readline的写法。
内容的提问来源于stack exchange,提问作者Jack Karrde
相关产品推荐
相关产品推荐

