我正忙着为一个对R知之甚少的客户编写软件包.鉴于其复杂的数据结构,我需要在R中建立一个"数据库",其中包含从他们从另一家公司获得的一组电子表格中获得的大量信息.由于他们不能在他们的计算机上安装SQL等(ICT有一些功率控制问题......),我已经在R中根据特定的目录结构编写了一个仿真.现在我想自动运行它,但只是第一次加载包.有点像.First.lib,但是.VeryFirst.
关于如何在第一次加载包时加载一段代码的任何想法?我无法在手册中的任何地方找到它,所以欢迎所有指针.
假设我有一个data.frame
x <- data.frame(a = c('A','A','A','A','A', 'C','C','C','C', 'B','B','B'),
b = c('a','c','a','a','c', 'd', 'e','e','d', 'b','b','b'),
c = c( 7, 3, 2, 4, 5, 3, 1, 1, 5, 5, 2, 3),
stringsAsFactors = FALSE)
> x
a b c
1 A a 7
2 A c 3
3 A a 2
4 A a 4
5 A c 5
6 C d 3
7 C e 1
8 C e 1
9 C d 5
10 B b 5
11 B b …Run Code Online (Sandbox Code Playgroud) 这个问题的讨论是我提出这个问题的直接原因.更一般的原因是我经常需要向只熟悉SPSS的人解释R使用.我知道SPSS的大部分基础知识,因为我们仍然在基础课程统计中使用它.但由于我更像是一个R家伙,因此很难知道SPSS用户如何体验与R的第一次见面.
我知道有一本关于SAS和SPSS用户的书,它已经包含了一些信息.然而,我想知道当你从SPSS切换到R时,更困难的部分是什么.
或者换句话说:如果您需要在一天内向SPSS用户解释R,您会关注哪些主题?这是不是对了(是的,我知道,这不是因为一个得到报酬,它总是有道理...)一个假设性的问题.
只是想知道为什么重复行为与NAs一样:
> duplicated(c(NA,NA,NA,1,2,2))
[1] FALSE TRUE TRUE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
事实上
> NA == NA
[1] NA
Run Code Online (Sandbox Code Playgroud)
有没有办法实现重复标记NAs为假,像这样?
> duplicated(c(NA,NA,NA,1,2,2))
[1] FALSE FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud) 接受函数names:这是R中的原始函数.对于原始函数,创建了一个隐式S4泛型,因此可以为该函数构造S4方法.
采用如下定义的S4类:
setClass("aClass",
representation=list(
values = "character",
id = "numeric"
),
prototype=list(
values = character(0),
id = numeric(0)),
validity=function(object){
length(object@values)==length(object@id)
}
)
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个函数来提取名称,无论是已排序还是未排序.我想使用该函数names来避免必须创建新函数getNames()或其他任何东西,因为这不太直观.
以下是对需要完成的工作的概念:
setMethod("names",signature="aClass",
function(x,ordered=TRUE){
if(ordered)
x@values[x@id]
else
x@values
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,names原始函数也不起作用,并且ordered不是隐式泛型的参数.
如何在以下条件下完成此工作:
names函数应保留其所有其他对象的原始行为,包括来自其他包的对象.你如何获得一个有光泽的downloadHandler来更新filename每次点击下载按钮后的值?我尝试使用Sys.time构建一个唯一的文件名.唉,当Shiny应用程序打开时,Sys.time()似乎只执行一次.因此,尝试第二次下载文件不会给出新文件名,只是在文件名末尾给出[1].
下面的最小可重复示例:
library(shiny)
if (interactive()) {
ui <- fluidPage(
downloadButton("downloadData", "Download")
)
server <- function(input, output) {
# Our dataset
data <- mtcars
output$downloadData <- downloadHandler(
filename = paste("example",gsub(":","-",Sys.time()), ".csv", sep=""),
content = function(file) {
write.csv(mtcars,file)
}
)
}
runApp(list(ui=ui,server=server),launch.browser=T)
}
Run Code Online (Sandbox Code Playgroud)
确保您尝试在同一实例中第二次下载文件,检查文件上的名称.
我对函数的不同环境有几个问题.请看以下示例:
environment(sd)
# <environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)
命名空间:stats是否指向函数sd的封闭环境?
pryr::where(sd)
# <environment: package:stats>
Run Code Online (Sandbox Code Playgroud)
package:stats是否指向函数sd的绑定环境?
根据Hadley Wickham的高级R说:"封闭的环境属于这个功能,永远不会改变......"
但是功能的封闭环境可以改变如下:
new.env <- new.env()
environment(f) <- new.env
Run Code Online (Sandbox Code Playgroud)
函数'environment属性表示函数的执行环境,对吗?关于R通过环境查找内容的在线文章
总结一下我的问题:
stats什么?它类似于一前一后在这里.
我有一个数据框,每一行都有时间事件。在一行中,我有发送者的事件类型(typeid=1),另一行有接收者的事件(typeid=2)。我想计算发送方和接收方之间的延迟(时差)。
我的数据组织在 data.frame 中,如下面的快照所示:
dd[1:10,]
timeid valid typeid
1 18,00035 1,00000 1
2 18,00528 0,00493 2
3 18,02035 2,00000 1
4 18,02116 0,00081 2
5 18,04035 3,00000 1
6 18,04116 0,00081 2
7 18,06035 4,00000 1
8 18,06116 0,00081 2
9 18,08035 5,00000 1
10 18,08116 0,00081 2
calc_DelayVIDEO <- function (dDelay ){
pktProcess <- TRUE
nLost <- 0
myDelay <- data.frame(time=-1, delay=-1, jitter=-1, nLost=-1)
myDelay <- myDelay[-1, ]
tini <- 0
tend <- 0
for (itr in c(1:length(dDelay$timeid))) { …Run Code Online (Sandbox Code Playgroud) 我设法写了一个for loop比较以下向量中的字母:
bases <- c("G","C","A","T")
test <- sample(bases, replace=T, 20)
Run Code Online (Sandbox Code Playgroud)
test 将返回
[1] "T" "G" "T" "G" "C" "A" "A" "G" "A" "C" "A" "T" "T" "T" "T" "C" "A" "G" "G" "C"
Run Code Online (Sandbox Code Playgroud)
通过该功能,Comp()我可以检查字母是否与下一个字母匹配
Comp <- function(data)
{
output <- vector()
for(i in 1:(length(data)-1))
{
if(data[i]==data[i+1])
{
output[i] <-1
}
else
{
output[i] <-0
}
}
return(output)
}
Run Code Online (Sandbox Code Playgroud)
导致;
> Comp(test)
[1] 0 0 0 0 0 1 0 0 0 0 0 1 1 1 …Run Code Online (Sandbox Code Playgroud) 我有一段很长的继承的FORTRAN77代码,我从R调用它.Fortran().Fortran代码包含一组子例程,当嵌入到Fortran程序中并随后从命令行编译和运行时可以工作.但是,当我从R调用它时,它第二次调用该函数时会崩溃R.
由于Fortran代码使用大量索引和数组维度存储为变量,因此我认为存在问题.在某些时候,Fortran代码正在寻找内存中不应该存在的位置.因此,我需要逐步检查Fortran代码,检查是否所有来自R的内容都是我认为的,并且代码执行我认为它的功能.
如果它是一个R函数,我可以选择使用debug(),添加browser()语句并打印出我希望在代码中的某个点看到的任何值.但Fortran代码不允许任何这些事情发生.如果我理解正确,Fortran的屏幕输出不会被R捕获.
所以有人知道我究竟能检查R传递给Fortran代码的参数的类型和值.如果你可以解释一下我从R调用后如何调试该代码,那将是非常出色的.
这是一个例子来说明我的意思.
C An example program
C
PROGRAM EXAMPLE
INTEGER N
PARAMETER (N=10)
REAL X0, X(N),MEAN
C
X0 = 14
DO 10 I = 1,10
FI = FLOAT(I)
X(I) = X0 + FI
10 CONTINUE
CALL MYSUB(X0,MEAN)
END
C
C Mysub the subroutine
C
SUBROUTINE MYSUB(X,N,MEAN)
INTEGER N
REAL X(N), MEAN
MEAN = 0
DO 20 I = 1,N
MEAN = MEAN + X(I)
20 CONTINUE
MEAN = MEAN / N …Run Code Online (Sandbox Code Playgroud) r ×10
call ×1
comparison ×1
dataframe ×1
debugging ×1
download ×1
duplicates ×1
environment ×1
fortran ×1
function ×1
generics ×1
install ×1
loops ×1
missing-data ×1
names ×1
package ×1
primitive ×1
s4 ×1
sapply ×1
shiny ×1
sorting ×1
spss ×1
subroutine ×1
vector ×1