我有一个包含多个块的脚本,其中的行看起来像这样......
#Read data for X
DataX = read.delim(file = 'XRecords.txt',
col.names = XFields[,'FieldName'])
print('Data X read')
#Convert fields that should be numeric into numeric so they can summed
DataX[,NumFieldNames] = as.numeric(as.character(XData[,NumFieldNames]))
print('Data X scrubbed')
Run Code Online (Sandbox Code Playgroud)
当我获取脚本时,我得到这样的输出......
[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
根据该输出,我重新加载数据Y并开始查找字符串到数字转换失败的记录.经过几个小时的挫折,我意识到数据X实际上是具有类型转换错误的数据.
看起来正在发生的是发出警告,但在脚本完成之前它不会显示在控制台上.有没有办法在警告出现后立即将警告输出到控制台?我尝试了flush.console(),但它似乎不适用于警告.
如果可以避免的话,我宁愿不在我的系统上加载任何额外的软件包.我正在使用它来工作,我不得不跳过几个箍,只是为了在我的电脑上安装CRAN发行版.
谢谢.我很感激帮助.
编写一个tryCatch将处理错误值但将忽略警告的代码。举个例子
foo <- function(x) {
if (x == 1) {
warning('Warning')
} else if (x == 0) {
stop('Error')
}
return(1)
}
bar <- function(x){
tryCatch(
expr = foo(x),
error = identity,
warning = function(w) invokeRestart("muffleWarning")
)
}
Run Code Online (Sandbox Code Playgroud)
因此foo,如果您传递 0 会警告您,如果您传递 1 则会出现错误。目的bar是如果您传递 0 则会收到错误,但它会抑制bar传递 1 时生成的警告。该invokeRestart("muffleWarning")命令来自的定义suppressWarnings。它在我这里的建筑中不起作用,我不知道为什么。(具有讽刺意味的是,它会生成一个错误,因此尝试成功将我不想要的警告升级为我无法解释的错误。)
这个定义bar将起作用
bar <- function(x){
tryCatch(
expr = foo(x),
error = SomeFunctionThatDoesNotMatter,
warning = function(w){suppressWarnings(foo(x))}
) …Run Code Online (Sandbox Code Playgroud) 我有一个已经使用data.frame上下文编写的项目.为了改善计算时间,我试图利用data.table的速度来代替.我的方法是构建包装函数,读取框架,将它们转换为表格,进行计算,然后转换回框架.这是一个简单的例子......
FastAgg<-function(x, FUN, aggFields, byFields = NULL, ...){
require('data.table')
y<-setDT(x)
y<-y[,lapply(X=.SD,FUN=FUN,...),.SDcols = aggFields,by=byFields]
y<-data.frame(y)
y
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在运行此函数后,x已转换为表格,然后我使用data.frame表示法编写的代码行失败.如何确保运行函数不改变我输入的data.frame?
我有一个 AWS Lambda 函数 (Python3.8),在其中尝试使用 SQLAlchemy 连接到 RDS 代理。我已经确认函数配置将允许使用 PyMySQL 直接连接到代理。当我运行该函数时,我收到一条错误消息“(pymysql.err.InternalError) (3159, '此 RDS 代理需要 TLS 连接')\n(此错误的背景位于:http://sqlalche.me/e /2j85 )”。该错误的“背景”没有提及 TLS。我明白我需要做什么(告诉 SQLAlchemy 使用 SSL/TLS 连接),但我无法弄清楚这样做的语法。下面是我当前的代码。
import pymysql
import sqlalchemy
from database_info import make_connection_str
print('connecting to database')
CONN_STR = make_connection_str()
ENGINE = sqlalchemy.create_engine(CONN_STR)
METADATA = sqlalchemy.MetaData(ENGINE)
TABLE = sqlalchemy.Table('active_prospect', METADATA, autoload=True) #error comes with this line
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情与以下内容有关
ssl-mode=REQUIRED是需要的。pymysql.connect(... ssl={"true": True})作品。基于这两件事,我以两种不同的方式尝试了 (ssl-mode, ssl) = ('true', 'required') 的每种组合。
CONN_STR += '?ssl-mode=REQUIRED'create_engine(CONN_STR, connect_args={'ssl': 'True'})结果各不相同。在某些情况下,上面的错误已被替换AttributeError: 'str' …
我会潜入它...
DT_1 <- data.table(pk = c(1,1,2,2), val = 1:4, key = 'pk')
DT_2 <- data.table(pk = 1:2, att = c('a','b'), key = 'pk')
Run Code Online (Sandbox Code Playgroud)
这有效.
> DT_2[i = DT_1, j = `:=`(max_val = max(val))]
> DT_2
pk att max_val
1: 1 a 4
2: 2 b 4
Run Code Online (Sandbox Code Playgroud)
事实并非如此.
> DT_2[i = DT_1, j = `:=`(max_val = max(val)), by = .(pk)]
Error in `[.data.table`(DT_2, i = DT_1, j = .(max(val)), by = .(pk)) :
object 'val' not found
Run Code Online (Sandbox Code Playgroud)
为什么以及如何处理它?
我正在尝试创建一个 R 脚本来汇总数据框中的度量。我希望它对数据框结构的变化做出动态反应。例如,我有以下块。
library(plyr) #loading plyr just to access baseball data frame
MyData <- baseball[,cbind("id","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,"id"]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)
此块创建一个数据框 (AggHits),其中包含每个玩家 (id) 的总点击次数 (h)。好极了。
假设我想带入团队。如何更改 by 参数,以便 AggHits 具有“id”和“team”的每个组合的总点击次数?我尝试了以下操作,第二行抛出错误:参数必须具有相同的长度
MyData <- baseball[,cbind("id","team","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind("id","team")]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)
更一般地说,我想编写第二行,以便它自动按除 h 之外的所有变量聚合 h。我可以很容易地使用 setdiff 生成要分组的变量列表。
# set the list of variables to summarize by as everything except hits
SumOver <- setdiff(colnames(MyData),"h")
# total up all the hits - again this line throws an error
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind(SumOver)]), FUN=sum)
Run Code Online (Sandbox Code Playgroud)
我使用它的业务目的涉及一个 csv …
我有一个包含交易的数据表.除其他事项外,交易标记有日期/时间和客户.
library(data.table)
transactions <- data.table(trans.id = 1:10,
customer.id = c(rep(c('a','b'),3),'c'))
set.seed(42)
transactions[, time := sample(500, 10, T)]
Run Code Online (Sandbox Code Playgroud)
对于每个交易,我想查找客户的前一个交易,这样我就可以做一些事情,比如计算自上次交易以来的时间.这是我能做的最好的......
Find.Prior.ID <- function(id.curr) {
trans.curr <- transactions[trans.id == id.curr]
time.curr <- trans.curr[, time]
customer <- trans.curr[, customer.id]
prior.trans <- transactions[
time < time.curr & customer.id == customer]
if (dim(prior.trans)[1] == 0) {return(NA)}
time.prior <- prior.trans[,max(time)]
id.prior <- prior.trans[
time == time.prior,
trans.id]
return(id.prior)
}
transactions[, prior.id := unlist(lapply(
X = trans.id, FUN = Find.Prior.ID))]
Run Code Online (Sandbox Code Playgroud)
一旦我prior.id填充了一个简单的合并允许我映射我想要的任何其他信息.我的问题真的归结为运行时间.这种结构具有突出的长时间运行.有没有办法更快地做到这一点?
答案(具体到相关示例)
setorder(transactions, time)
transactions[, …Run Code Online (Sandbox Code Playgroud) 任何人都可以向我解释为什么bar不起作用?这是一个错误data.table吗?
Circles<-data.table(radius=1:10)
foo<-function(Circ){
Circ[,diameter:=2*radius]
}
dput(x = foo,file = 'func.R')
bar<-dget(file = 'func.R')
foo(Circles)
bar(Circles)
Run Code Online (Sandbox Code Playgroud)
它与dget函数设置它返回的对象的环境这一事实有关.GlobalEnv.有一个简单易用的工作,但它会让像我这样的新手疯狂地试图弄清楚它为什么会破坏它.
MyDGet<-function(file){
temp<-dget(file=file)
environment(temp)<-.GlobalEnv
return(temp)
}
bar<-MyDGet(file = 'func.R')
Run Code Online (Sandbox Code Playgroud) r ×7
data.table ×4
amazon-rds ×1
aws-lambda ×1
mysql ×1
python-3.8 ×1
sqlalchemy ×1
try-catch ×1