对于我下学期要学习的 ML 类(class),我们使用的是自动评分系统。我们要求学生自己实现一些标准算法,所以我们想限制学生加载某些库(黑名单或白名单,不确定。)
有什么合理的方法可以用 R 或 matlab 做到这一点吗?还是检查源代码(即正则表达式/grep)是最好的方法?
最佳答案
使用trace
函数改变library
的行为。当调用 library
函数时,以下代码检索传递给 library
的包的名称,如果它在禁止列表中则抛出错误。
trace(
base::library,
function()
{
package_name <- if(parent.frame()$character.only)
{
parent.frame()$package
} else
{
deparse(substitute(package, parent.frame()))
}
if(package_name %in% c("ggplot2", "lattice")) #or whichever packages are banned
{
stop("The ", sQuote(package_name), " package is not allowed")
}
}
)
library(ggplot2)
library("ggplot2", character.only = TRUE)
library(plyr)
您还需要跟踪
require
函数。
当心偷偷摸摸的学生:如果他们知道这是你阻止包加载的方式,那么他们可以在他们的脚本中关闭跟踪(并可能在之后重新启用它)。您也许还应该在他们的脚本中检查对 trace
/untrace
/traceOn
/traceOff
的调用。你为此付出了多少努力取决于你将做多少手工查看他们的代码以及你的学生有多诚实。如果您阅读这样奇怪的规避代码,应该会很明显。
关于R/MATLAB : restricting which libraries can be loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640321/