首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中sqldf中使用UPDATE语句

在R中sqldf中使用UPDATE语句
EN

Stack Overflow用户
提问于 2020-04-22 19:32:05
回答 1查看 1.7K关注 0票数 0

我知道使用基R更新值比较容易,但我必须在sqldf中这样做。我有一个数据框架,我想根据条件更新一个字段。如果column2是'c',那么更新column1中的值。

代码语言:javascript
复制
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语句。其结果是该表从未更新/更改。

非常感谢你宝贵的时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 20:20:44

这既是已知的,也是有意的:sqldf从不尝试更新环境中的对象。它只是充当管道,将数据复制到sqlite (temp)数据库并运行查询,包从来不打算覆盖调用环境中的源对象。

sqldf README中的参考常见问题8

虽然传递给sqldf的SQL语句中引用的数据帧会自动导入到SQLite,但是sqldf出于安全原因不会自动导出任何内容。因此,如果使用sqldf更新表,则必须显式地返回它,如下例所示。

使用您的数据:

代码语言:javascript
复制
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

(您可以安全地忽略该警告,这是因为第一个语句没有返回任何内容。)

因此,要实际使用它来更新环境中的对象,您需要自己捕获输出。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61373594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档