我知道使用基R更新值比较容易,但我必须在sqldf中这样做。我有一个数据框架,我想根据条件更新一个字段。如果column2是'c',那么更新column1中的值。
column1 <- c(1,2,3,4)
column2 <- c("a","b","c","d")
temp <- data.frame(column1,column2)
sqldf("
UPDATE temp
set column1=100
WHERE column2 ='c'
")上面的代码在result_fetch(res@ptr,n= n)中给我“0列0行的数据框架”和警告消息:必须用dbExecute()或dbSendStatement()而不是dbGetQuery()或dbSendQuery()发出SQL语句。其结果是该表从未更新/更改。
非常感谢你宝贵的时间。
发布于 2020-04-22 20:20:44
这既是已知的,也是有意的:sqldf从不尝试更新环境中的对象。它只是充当管道,将数据复制到sqlite (temp)数据库并运行查询,包从来不打算覆盖调用环境中的源对象。
sqldf README中的参考常见问题8
虽然传递给sqldf的SQL语句中引用的数据帧会自动导入到SQLite,但是sqldf出于安全原因不会自动导出任何内容。因此,如果使用sqldf更新表,则必须显式地返回它,如下例所示。
使用您的数据:
sqldf(c("
UPDATE temp
set column1=100
WHERE column2 ='c'
", "select * from main.temp"))
# Warning in result_fetch(res@ptr, n = n) :
# SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().
# column1 column2
# 1 1 a
# 2 2 b
# 3 100 c
# 4 4 d(您可以安全地忽略该警告,这是因为第一个语句没有返回任何内容。)
因此,要实际使用它来更新环境中的对象,您需要自己捕获输出。
temp
# column1 column2
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
temp <- suppressWarnings(sqldf(c("
UPDATE temp
set column1=100
WHERE column2 ='c'
", "select * from main.temp")))
temp
# column1 column2
# 1 1 a
# 2 2 b
# 3 100 c
# 4 4 dhttps://stackoverflow.com/questions/61373594
复制相似问题