我有一个可供多个用户使用的flexdashboard。他们读取、修改和写入相同的(csv(文件。我还不知道如何使用SQL连接来实现这一点,所以在此期间(我需要一个可用的应用程序(,我想使用一个简单的.csv文件作为数据库。这应该很好,因为用户不太可能在同一时间处理它,而且加载和写入整个文件几乎是即时的。
因此,我的策略是:
1-加载文件,
2-编辑(编辑在反转换为数据帧的rhandontable中完成(
3-保存:(a( -再次加载文件(以获取最新数据(,(b( -附加来自rhandontable的编辑并保留最新数据(由时间戳指示((c( -write.csv
我想我应该在(1(中添加一些内容,这样它就可以检查文件是否已经在使用/打开(因为其他用户在(3(中(。因此:检查是否打开,如果不打开->继续,否则->sys.sleep(3(并重试。
关于如何在R中做到这一点,有什么想法吗?在Delphi中,它将类似于:如果fileinuse(filename(,则sleep(3(else df<-读取.csv
R方式是什么?
编辑:
我从我编辑过的答案开始,因为它更优雅。这使用shell命令来测试文件是否可用,如本问题中所讨论的:
如果给定的文件或目录被锁定(由任何进程使用(,如何在命令行中进行检查?
这避免了加载和保存文件,因此效率更高。
# Function to test availability
IsInUse <- function(fName) {
shell(paste("( type nul >> ", fName, " ) 2>nul && echo available || echo in use", sep=""), intern = TRUE)=="in use"
}
# Test availability
IsInUse("test.txt")
原始答案:
有趣的问题!在尝试写入文件之前,我没有找到检查文件是否正在使用的方法。下面的解决方案远非完美。它依赖于tryCatch函数,以及读取和写入文件以检查文件是否可用(根据文件大小,这可能会非常慢(。
# Function to check if the file is in use (relies on reading and writing which is inefficient)
IsInUse <- function(fName) {
rData <- read.csv(fName)
tryCatch(
{
write.csv(rData, file=fName, row.names = FALSE)
return(FALSE)
},
error=function(cond) {
return(TRUE)
}
)
}
# Loop to check if file is in use
while(IsInUse(fName)) {
print("Still in use")
Sys.sleep(0.1)
}
# Your action here
我还发现这个问题的答案很有用。如何用R编写trycatch来理解trycatch函数。
我很想看看是否还有其他人有更优雅的建议!
确实是个有趣的问题!对优雅的解决方案也很好奇。。。