-2

在 RUnit 测试中,我有这个片段:

checkTrue(!file.exists(fname))
doSomething()
#cat(fname);print(file.info(fname))
checkTrue(file.exists(fname))

即使doSomething()创建了一个文件,对 checkTrue() 的第二次调用也失败了。我已经确认该文件在那里,并带有注释掉的行,如上所示。

所以,我想知道第二次调用file.exists是否使用缓存数据?在 PHP 中有一个函数clearstatcache可以阻止这种情况的发生。有R等价物吗?(或者,也许有人知道 R 从不缓存 stat 调用的结果?)

4

1 回答 1

2

file.exists不缓存 stat 调用的结果,因此没有 PHP 的clearstatcache. (另外:这也意味着过度使用调用file.exists或任何stat函数可能会降低性能。)

从 R 3.0.1 开始,file.exists使用内部方法。如果您通过源代码跟踪它,您最终将R_FileExists在 sysutils.c 中调用 ,:

Rboolean R_FileExists(const char *path)
{
    struct stat sb;
    return stat(R_ExpandFileName(path), &sb) == 0;
}

(在 Windows 上,它改为使用对_stat64的调用,我刚刚确认它也不会进行缓存。)

于 2013-06-18T01:11:16.630 回答