能否在高版本R中指定特定版本的BWidget与Tktable组件?
在R 4.2.2里指定加载旧版本BWidget和Tktable的办法
核心逻辑
高版本R默认会加载自带的新版Tcl组件,要用上旧版本,就得让Tcl解释器先找到旧组件的文件,把旧路径优先加入搜索列表就行。
具体操作步骤
拷贝旧版本组件文件
- 找到你电脑上R 3.2.2的安装目录,比如
C:/Program Files/R/R-3.2.2/,进去找library/tcltk/lib/文件夹,里面会有BWidget1.8和Tktable2.9两个文件夹。 - 把这两个文件夹复制到一个容易找的地方,比如
C:/R_old_tcl_libs/,别放太深,避免路径出错。
- 找到你电脑上R 3.2.2的安装目录,比如
在R脚本里设置加载路径
- 打开你的脚本,在最开头加载
tcltk包之后,先添加旧组件的路径,再指定版本加载:library(tcltk) # 添加旧组件路径到Tcl搜索优先级最前面 addTclPath("C:/R_old_tcl_libs/BWidget1.8") addTclPath("C:/R_old_tcl_libs/Tktable2.9") # 指定版本加载组件,确保不用新版 tclRequire("BWidget", version = "1.8") tclRequire("Tktable", version = "2.9") - 注意路径要和你实际拷贝的位置一致,用绝对路径最稳妥,别用相对路径。
- 打开你的脚本,在最开头加载
检查是否加载成功
- 运行上面的代码后,用下面的命令验证版本是否正确:
# 检查BWidget版本是否是1.8 tcl("package", "vcompare", tcl("package", "provide", "BWidget"), "1.8") # 返回0就是版本匹配,1是加载了更高版本,-1是更低版本 # 检查Tktable版本是否是2.9 tcl("package", "vcompare", tcl("package", "provide", "Tktable"), "2.9")
- 运行上面的代码后,用下面的命令验证版本是否正确:
额外提醒
- 如果拷贝过去的旧组件还依赖R 3.2.2里的其他Tcl文件,可能得把对应的文件也一并复制,但一般BWidget和Tktable都是独立的,大概率不用。
- 如果指定旧版本后还是有问题,就得看看脚本里生成第二个下拉菜单的代码了——新版本组件可能改了某些命令的返回格式,比如获取列层级的逻辑可能需要微调,但先把版本切换过去再排查。
内容的提问来源于stack exchange,提问作者aiorr
相关产品推荐
相关产品推荐

