我知道使用base 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'
")
上面的代码给我 "数据框有0列0行 "和警告信息 "在res_fetch(res@ptr, n = n) : SQL语句必须用dbExecute()或dbSendStatement()而不是dbGetQuery()或dbSendQuery()发出。" 结果是表从来没有更新过changed。
非常感谢您的宝贵时间。
这是已知的,也是故意的。sqldf
从来没有试图更新环境中的对象。它只是通过将数据复制到sqlite(temp)数据库中并运行查询来充当管道,从来没有包打算覆盖调用环境中的源对象。
参考FAQ 8中的 sqldf
README:
虽然传递给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 d